使用复合键将行插入表时出现问题

问题描述 投票:0回答:1

我设置了一个表(参见图片),其中包含 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 行

php sql mysql composite-key
1个回答
0
投票

这很大程度上取决于 (

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
。这是强制唯一性的键的普遍事实,例如主键或唯一键。

如果您的组合键具有不同的性质,例如索引或其他东西,那么问题就出在其他方面。

查看您的错误消息,立即清楚您有一个主键。

© www.soinside.com 2019 - 2024. All rights reserved.