我设置了一个表(参见图片),其中包含 member_id 和 book_id 的复合键。如果我使用 phpMyAdmin SQL 选项卡插入 member_id 和 book_id 相同的记录,则插入该记录没有问题。但是,使用 php 执行相同操作会引发重复键的致命错误。然而记录被插入。在尝试 php 插入之前,我已从表中删除了该行!
我知道拥有两个组成部分相同的复合键就可以了。只有当尝试插入具有相同组合键的两行时才会出现问题?
$sql = "INSERT INTO votes (member_id, book_id, votes, title) VALUES ('99', '99', '5', 'test')";
if (mysqli_query($link, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>";
}
致命错误:未捕获 mysqli_sql_exception:/home/whoo7078/g2webworks.co.uk/testVotesTable.php:22 中键“PRIMARY”的重复条目“99-99”堆栈跟踪:#0 /home/whoo7078/g2webworks.co。 uk/testVotesTable.php(22): mysqli_query() #1 {main} 扔在 /home/whoo7078/g2webworks.co.uk/testVotesTable.php 第 22 行
这很大程度上取决于 (
member_id
, book_id
) 重复密钥的性质。如果它是 primary key
或 unique
,只要数据库中没有其他记录的组合键内的每个字段具有相同的值,您就可以插入/更新记录。
所以,如果你想插入 (5, 6) 或 (6, 5) 或 (99, 99),它本身并没有什么区别。区别在于数据库中已存在的记录。因此,如果要插入 (5, 6),但已经存在一条
member_id
为 5 and book_id
为 6 的记录,那么插入具有完全相同 member_id
和 book_id
的新记录将违反复合键的唯一性,这在主键或唯一键的情况下是不允许的。这就是为什么您收到上述错误的原因,而不是因为您的 member_id
恰好等于您尝试插入的记录中的 book_id
。这是强制唯一性的键的普遍事实,例如主键或唯一键。
如果您的组合键具有不同的性质,例如索引或其他东西,那么问题就出在其他方面。
查看您的错误消息,立即清楚您有一个主键。