Simon
Simon

Reputation: 481

MySQL update or insert for tables without primary key

I know the simple way to perform update or insert is using 'REPLACE' but it needs a primary key, how about in the case of a table without primary key?

I have 5 columns in my table:

  1. remark_id(the auto-increment primary key)
  2. user_id
  3. remark_user_id
  4. remark
  5. last_modified

I wish to check whether the pair of user_id and remark_user_id exists first before updating the remark, else a new row will be created to save the remark with the user_id and remark_user_id.

Here's my code

INSERT INTO `users_remark` (`user_id`, `remark_user_id`, `remark`) 
SELECT 1,3 ,'testing123'
FROM dual
WHERE NOT EXISTS
    (SELECT *
     FROM `users_remark`
     WHERE `user_id` = 1
       AND `remark_user_id` = 3)

After running the SQL, nothing happens in my Database. No record was added or updated.

[Edited]

Code changes using IF...ELSE... but it comes with some syntax errors on first line

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS (SELECT * FROM users_remark WHERE user_id' at line 1

IF EXISTS (
    SELECT * FROM `users_remark` 
    WHERE `user_id`=1 AND `remark_user_id` = 3
    )
    THEN    UPDATE `users_remark` SET `remark` = 'testing123' 
            WHERE `user_id`=1 AND `remark_user_id` = 3
ELSE
    INSERT INTO `users_remark` SET `remark` = 'testing123', `user_id`=1, `remark_user_id` = 3

Upvotes: 0

Views: 8666

Answers (2)

Simon
Simon

Reputation: 481

I finally try on putting code to php, it works and much easier to understand.

        $checkRemark = mysqli_query($GLOBALS['db_conn'], "SELECT * FROM `users_remark` WHERE `user_id`=".$data['uid']." AND `remark_user_id` = ".$data['ruid']);
        if (mysqli_num_rows($checkRemark)>0){
            $remarkSql = "UPDATE `users_remark`
                         SET `remark` = '".$data['remark']."' 
                         WHERE `user_id`=".$data['uid']."
                             AND `remark_user_id` = ".$data['ruid'];
        } else {
            $remarkSql = "INSERT INTO `users_remark` (`user_id`, `remark_user_id`, `remark`)
                            VALUES (".$data['uid'].", ".$data['ruid'].", '".$data['remark']."')";
        }

Upvotes: 0

Joël Salamin
Joël Salamin

Reputation: 3576

Here is the query with both INSERT and UPDATE clauses (T-SQL syntax):

IF [condition here] BEGIN
     UPDATE `users_remark`
     SET `remark` = 'testing123' 
     WHERE `user_id`=1
         AND `remark_user_id` = 3
END
ELSE BEGIN
    INSERT INTO `users_remark` (`user_id`, `remark_user_id`, `remark`)
    VALUES (1, 3, 'testing123)
END

EDIT: Same query with MySQL syntax

DECLARE @numrecords INT

SELECT @numrecords = count(*)
FROM `users_remark`
WHERE `user_id` = 1
   AND `remark_user_id` = 3

IF @numrecords > 0 THEN
     UPDATE `users_remark`
     SET `remark` = 'testing123' 
     WHERE `user_id`=1
         AND `remark_user_id` = 3
ELSE
    INSERT INTO `users_remark` (`user_id`, `remark_user_id`, `remark`)
    VALUES (1, 3, 'testing123)
END IF

Hope this will help you.

Upvotes: 1

Related Questions