INSERT 或 UPDATE,但不确定我是否可以进行重复密钥更新

INSERT or UPDATE, but not sure I can have duplicate key update

创建一点书签系统。用户可以为要关注的玩家添加书签或取消添加书签。从表面上看,我认为重复密钥更新适用于 playerID。但是,一个玩家可能有多个用户为他添加书签。

因此它必须将 playerID 与 userID 配对。如果该对不存在,则插入。如果该对确实存在,请更新。

以下是我的重复密钥更新。我将如何检查两列的配对?连续?

$query = "INSERT INTO a_player_bookmark (playerID,bookmark,userID,username)
                        VALUES ('". $pid ."','". $bookmark ."','". $userID ."','". $user ."')
                        ON DUPLICATE KEY
                        UPDATE bookmark = '". $bookmark ."'

                        ";

对,所以通过外键关联每一列(为了完整起见),然后在 2 列 上创建一个唯一键,playerID (追随者)和 userID(跟随)。那么你可以有a -> b,还有b -> a,但是再次添加会出现duplicate key的错误。这允许您使用 ON DUPLICATE KEY UPDATE follower=follower 跳过插入,或使用 bookmark = VALUES(bookmark) 更新书签值。

为了简洁起见,我还重命名了您的 table bookmarks

-- the sql query (plain text / string)
INSERT INTO bookmarks (playerID, bookmark, userID, username)
    VALUES (:playerID, :bookmark, :userID, :username)
ON DUPLICATE KEY UPDATE bookmark = VALUES(bookmark)

现在,在 PHP 中,我已经演示了 运行 使用 PDO 准备好的语句的基本概念。如果你不愿意做 PDO 那么你可以相应地连接到查询中(自己替换占位符),但我强烈反对它。

//within php
$con = /* a PDO connection reference, see PDO docs for creating one */;
$query = /* our earlier statement, in string form */;
$stmt = con->prepare($query); //creates a PreparedStatement
//bind our values to the placeholders in the sql statement
$stmt->bindValue(':playerID', $pid, PDO::PARAM_INT);
$stmt->bindValue(':bookmark', $bookmark, PDO::PARAM_STR);
$stmt->bindValue(':userID', $userID, PDO::PARAM_STR);
$stmt->bindValue(':username', $user, PDO::PARAM_STR);
$stmt->execute(); //run the query
$updated = $stmt->rowCount(); //number of updated rows

向前推进,我将删除 username 作为一列(似乎多余,为什么不直接引用用户 table 来获取名称?),然后根据 [= 的目的21=] 我什至可能会放弃它。

但在此之前,您需要确保 table.

上的密钥正确
-- I suggest removing any existing constraints beforehand
-- Relate playerID to the users table
ALTER TABLE bookmarks ADD CONSTRAINT `FK_follower` FOREIGN KEY (`playerID`) REFERENCES `users` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
-- Relate userID to the users table
ALTER TABLE bookmarks ADD CONSTRAINT `FK_followed` FOREIGN KEY (`userID`) REFERENCES `users` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
-- Relate username to the users table, if you decide to keep it
ALTER TABLE bookmarks ADD CONSTRAINT `FK_followed_name` FOREIGN KEY (`username`) REFERENCES `users` (`username`) ON UPDATE CASCADE ON DELETE CASCADE
-- Add your UNIQUE KEY for the two columns defining the relationship, aka a composite key
ALTER TABLE bookmarks ADD UNIQUE INDEX `following` (`playerID`, `userID`)