好的,我仍然是数据库的初学者。我有这个代码
$sql="INSERT INTO complaints_members(password, complaint) VALUES ('$mypassword','$submit') ON DUPLICATE KEY UPDATE complaint='$submit' ; ";
这只是在现有条目中更新我的投诉。如何使用相同的密钥插入新条目,而不是更新旧条目?
我这样想。
第一个条目就像
密码:123
投诉:abc
第二个就像
密码:123
投诉:def
我对SQL的条款不太熟悉,所以我提前抱歉,谢谢你的时间。
编辑:这是表格
的方式
答案 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 = ?