我有一张table如下:
CREATE TABLE customers (
cus_id int, NOT NULL, AUTO_INCREMENT,
gov_id int, NOT NULL UNIQUE,
name varchar(64), NOT NULL
address varchar(128), NOT NULL
);
当我需要插入数据时,我首先查看 gov_id
一位客户给了我,并检查我的表中是否已有数据。如果没有,则插入行。否则,我会更新 name
以及 address
排在第一位。
我知道我可以用 INSERT ON DUPLICATE KEY UPDATE
但问题是, Bob
的 cus_id
可能是 123
以及 Sam
的 gov_id
可能是 123
. 所以当我尝试插入 Sam
(一个新客户),mysql可能会认为它是一个复制品,而实际上不是。我有什么选择?我该怎么解决这个问题。
还有什么办法能让我把钱拿回来吗 cus_id
在我做完手术之后。所以如果我插入行,我就得到 cus_id
如果我更新了行,我仍然会得到 cus_id
. 虽然这是一个mysql问题,但我的实现是用php实现的
我使用的旧方法(可能重复):
我会先检查客户是否存在
SELECT cus_id FROM customers WHERE gov_id = 123;
在这一点上,有可能重复。不管怎样,如果客户存在,我就跑
UPDATE customers SET name = "Bob", address = "123 something rd" WHERE cus_id=555;
否则我就跑
INSERT INTO customers (gov_id, name, address) VALUES (123, "Sam", "567 pizza st");
然而,在一天结束的时候,当我使用旧方法时,我总是有 cus_id
在我运行了上述操作之后。如果他们存在,我可以得到 cus_id
从 select
声明。如果他们不存在,我会得到 cus_id
从 insert
声明。
2条答案
按热度按时间arknldoa1#
我更改了您的create table sql,因为它在我的沙盒中似乎包含一些错误:
我不知道你为什么这么说
INSERT ON DUPLICATE KEY UPDATE
不能在你的地方工作。我想cus_id
以及gov_id
是不同的键,它们不应该互相影响。不管怎样,我还是选择使用
INSERT ON DUPLICATE KEY UPDATE
,如果有任何误解,请告诉我:下面是插入结果,当cus\u id 133已经在customers表中时,我们希望插入一个新custerm,其gov\u id也是133。
vngu2lb82#
为了防止重复,您可以对这两个成员使用unique index,例如->在(name,gov\u id)上创建unique index,这样您就永远不会看到具有相同名称和相同gov\u id的重复行,但您可以有另一个具有相同名称和相同gov\u id的行
这是另一个很棘手的更快的方法