我一直在尝试在 mysql 表中插入/更新记录。不能使用 ON DUPLICATE KEY,因为我与主键无关。
基本上我必须更新数据库中的记录
INSERT INTO table (city, state, gender, value) VALUES ("delhi","delhi","M",22)
如果存在该城市、州、性别的记录,则只需覆盖该值。
我可以在不从编程语言发送两个查询的情况下实现这一点吗
实际上您仍然可以使用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
请记住,诸如ON DUPLICATE KEY
和之类的结构REPLACE INTO
是专门为防止这种情况而设计的。防止来自应用程序层的两个查询的唯一另一种方法是声明一个执行相同操作的数据库函数。
因此,添加UNIQUE(city, state, gender)
跨相同列的键或主键。两者的区别在于每一列的取值范围;主键强制NOT NULL
,而UNIQUE
允许列是NULL
.
差异是微妙的,但有时会导致意想不到的结果,因为NULL
值被认为是唯一的。例如,假设您的数据库中有这些数据:
nr | name
123 | NULL
如果您尝试插入另一个(123, NULL)
,则使用时不会抱怨UNIQUE(nr,name)
;这可能看起来像一个错误,但事实并非如此。