我一直在尝试在mysql表中插入/更新记录。无法使用ON DUPLICATE KEY,因为我与主键无关。
基本上我必须更新数据库中的记录
INSERT INTO table (city, state, gender, value) VALUES ("delhi","delhi","M",22)
如果存在该城市,州,性别的记录,则只需覆盖该值。
我是否可以在不从编程语言发送两个查询的情况下实现此目的
答案 0 :(得分:3)
实际上您仍然可以使用ON DUPLICATE KEY
,只需在以下列中添加唯一索引,例如
ALTER TABLE tbl_name ADD UNIQUE index_name (city, state, gender)
您的查询现在将是,
INSERT INTO table (city, state, gender, value)
VALUES ('delhi','delhi','M', 22)
ON DUPLICATE KEY UPDATE value = 22
答案 1 :(得分:3)
请注意,ON DUPLICATE KEY
和REPLACE INTO
等结构是专门为防止这种情况而设计的。阻止应用程序层进行两次查询的唯一方法是声明一个执行相同操作的数据库函数。
因此,添加UNIQUE(city, state, gender)
键或跨越相同列的主键。两者之间的差异在于每列的值范围;主键强制NOT NULL
,而UNIQUE
允许列为NULL
。
差异很微妙但有时会导致意外结果,因为 NULL
值被视为唯一。例如,假设您在数据库中有这些数据:
nr | name
123 | NULL
如果您尝试插入另一个(123, NULL)
,则在使用UNIQUE(nr,name)
时不会抱怨;这可能看起来像bug,但事实并非如此。