如何插入数据而不重复

oug3syen  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(289)

我有一张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 但问题是, Bobcus_id 可能是 123 以及 Samgov_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_idselect 声明。如果他们不存在,我会得到 cus_idinsert 声明。

arknldoa

arknldoa1#

我更改了您的create table sql,因为它在我的沙盒中似乎包含一些错误:

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,
    PRIMARY KEY (`cus_id`)
);

我不知道你为什么这么说 INSERT ON DUPLICATE KEY UPDATE 不能在你的地方工作。我想 cus_id 以及 gov_id 是不同的键,它们不应该互相影响。
不管怎样,我还是选择使用 INSERT ON DUPLICATE KEY UPDATE ,如果有任何误解,请告诉我:

SET @update_id := 0;
insert into `customers` (gov_id, name, address) values (123, "Sam1", "567 pizza st")
on duplicate key update name = "Bob", address = "123 something rd", cus_id = (@update_id := cus_id);
SELECT
case
   when @update_id = 0 then LAST_INSERT_ID()
   when @update_id > 0 then @update_id
end as cus_id;

下面是插入结果,当cus\u id 133已经在customers表中时,我们希望插入一个新custerm,其gov\u id也是133。

mysql> select * from `customers`;
+--------+--------+------+------------------+
| cus_id | gov_id | name | address          |
+--------+--------+------+------------------+
|    123 |    122 | Sam  | 567 pizza st     |
|    124 |    123 | Bob  | 123 something rd |
|    128 |    124 | Bob  | 123 something rd |
|    131 |    125 | Sam1 | 567 pizza st     |
|    132 |    126 | Sam1 | 567 pizza st     |
|    133 |    127 | Sam1 | 567 pizza st     |
+--------+--------+------+------------------+
6 rows in set (0.00 sec)

mysql> SET @update_id := 0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into `customers` (gov_id, name, address) values (133, "Sam1", "567 pizza st")
    -> on duplicate key update name = "Bob", address = "123 something rd", cus_id = (@update_id := cus_id);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT
    -> case
    ->    when @update_id = 0 then LAST_INSERT_ID()
    ->    when @update_id > 0 then @update_id
    -> end as cus_id;
+--------+
| cus_id |
+--------+
|    134 |
+--------+
1 row in set (0.00 sec)

mysql> select * from `customers`;
+--------+--------+------+------------------+
| cus_id | gov_id | name | address          |
+--------+--------+------+------------------+
|    123 |    122 | Sam  | 567 pizza st     |
|    124 |    123 | Bob  | 123 something rd |
|    128 |    124 | Bob  | 123 something rd |
|    131 |    125 | Sam1 | 567 pizza st     |
|    132 |    126 | Sam1 | 567 pizza st     |
|    133 |    127 | Sam1 | 567 pizza st     |
|    134 |    133 | Sam1 | 567 pizza st     |
+--------+--------+------+------------------+
7 rows in set (0.00 sec)
vngu2lb8

vngu2lb82#

为了防止重复,您可以对这两个成员使用unique index,例如->在(name,gov\u id)上创建unique index,这样您就永远不会看到具有相同名称和相同gov\u id的重复行,但您可以有另一个具有相同名称和相同gov\u id的行
这是另一个很棘手的更快的方法

UPDATE table.customers SET (...) WHERE gove_id='SomeValue'
IF ROW_COUNT()=0
    INSERT INTO table.customers(...) VALUES (...)

相关问题