Sql使用重复键插入

时间:2015-02-06 18:28:52

标签: php mysql database

好的,我仍然是数据库的初学者。我有这个代码

$sql="INSERT INTO complaints_members(password, complaint) VALUES ('$mypassword','$submit') ON DUPLICATE KEY UPDATE complaint='$submit' ; ";

这只是在现有条目中更新我的投诉。如何使用相同的密钥插入新条目,而不是更新旧条目?

我这样想。

第一个条目就像

密码:123

投诉:abc

第二个就像

密码:123

投诉:def

我对SQL的条款不太熟悉,所以我提前抱歉,谢谢你的时间。

编辑:这是表格

的方式

enter image description here

3 个答案:

答案 0 :(得分:5)

您不能在数据库中拥有重复的主键。这是故意的。

相反,请考虑重新设计数据库,以便每个投诉都有唯一的ID(AKA是主键)。您应该将其设置为complaint_id或简称id,并将其设置为PK(主键)和AI(自动增量)。这样,当您进行插入时,您不必担心更新同一行。

答案 1 :(得分:0)

一种选择是将密码和投诉设为composite primary key

答案 2 :(得分:0)

为了将来参考,当有人要求您提供表格结构时,最好发布SHOW CREATE TABLE table_name的文字,而不是来自可视化编辑器的图片。

那说问题是您的主键是密码字段。您需要将两个主键添加到tabled,而不是唯一标识,然后您需要链接它们。

您的表结构应该更像这样:

CREATE TABLE `register` (
   `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   `username` varchar(255) NOT NULL,
   `password` varchar(255) NOT NULL,
   `email` varchar(255) NOT NULL,
   `number` INTEGER(255),
   `address` varchar(255),
   PRIMARY KEY (`id`),
   -- I assume that email and username should always be unique here
   UNIQUE KEY (`email`)
   UNIQUE KEY (`username`)
);

CREATE TABLE `complaints_members`
   `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   `complaint` VARCHAR(255),
   `password` varchar(255),
   `member_id` INTEGER UNSIGNED NOT NULL,
   PRIMARY KEY (`id`),
   KEY (`member_id`),
   CONSTRAINT `complaints_members_register` FOREIGN KEY (`member_id`) REFERENCES `register` (`id`) ON DELETE CASCADE
);

现在要创建一个新的成员投诉,您的SQL看起来像

INSERT INTO complaints_members(member_id, password, complaint) VALUES (?, ?, ?)

并获得成员的所有投诉:

SELECT c.* 
FROM compalaints_members c
WHERE c.member_id = ?