如果某些字段重复,您可以将忽略插入 table 吗?
Can you insert ignore into table if certain fields are duplicate?
我正在尝试插入 MySQL table,但我遇到了一个我似乎无法解决的问题。问题是如果某些字段重复但不是全部,我想在 table 中添加一条记录。
为了让我的问题更清楚,这是 table:
当我想插入此 table 时,我只想在用户标识和状态与 url 重复时插入忽略。如果这 3 个中的一个是唯一的,则可以将记录添加到 table.
我尝试过的:
INSERT IGNORE INTO mydb.mytable (unique_screen_id, userid, url, status)
VALUES ('1234', 1, 'something.com', 'active');
这不会给出预期的结果,因为 unique_screen_id 永远不会重复,因此该语句将插入记录。我无法从查询中删除 unique_screen_id 因为它还需要添加到 table
我可以使用哪个查询,这样如果我在上面插入记录,它会检查 userid and status and url 是重复的,如果它们是重复的,则忽略该语句(否则插入该语句)?
编辑:
根据要求我创建 table 查询:
CREATE TABLE `screens` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
我不确定你的 create table 语句是什么样的,但你可以添加 UNIQUE 键:
UNIQUE (userid ,url, status)
所以首先你像这样创建 table(没有唯一键):
CREATE TABLE `screens2` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
那么如果你添加这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 1, '1', 'something.com', 'active');
然后这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 1, '1', 'something.com', 'finished');
然后这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 2, '1', 'something.com', 'finished');
将插入所有 3 行...
如果您这样创建 table:
CREATE TABLE `screens` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
unique(userid, url, status)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
只会插入两行,其中一行将被忽略。
P.S。如果您添加 UNIQUE 键,您将不会在插入语句中使用 IGNORE 关键字。
根据用户VBoka的建议,下面的demo给出了答案!
我需要结合使用 insert ignore 语句和 Unique 关键字!
谢谢!
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5d19c458568ef9204c257b7ef6096eab
我正在尝试插入 MySQL table,但我遇到了一个我似乎无法解决的问题。问题是如果某些字段重复但不是全部,我想在 table 中添加一条记录。
为了让我的问题更清楚,这是 table:
当我想插入此 table 时,我只想在用户标识和状态与 url 重复时插入忽略。如果这 3 个中的一个是唯一的,则可以将记录添加到 table.
我尝试过的:
INSERT IGNORE INTO mydb.mytable (unique_screen_id, userid, url, status)
VALUES ('1234', 1, 'something.com', 'active');
这不会给出预期的结果,因为 unique_screen_id 永远不会重复,因此该语句将插入记录。我无法从查询中删除 unique_screen_id 因为它还需要添加到 table
我可以使用哪个查询,这样如果我在上面插入记录,它会检查 userid and status and url 是重复的,如果它们是重复的,则忽略该语句(否则插入该语句)?
编辑:
根据要求我创建 table 查询:
CREATE TABLE `screens` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
我不确定你的 create table 语句是什么样的,但你可以添加 UNIQUE 键:
UNIQUE (userid ,url, status)
所以首先你像这样创建 table(没有唯一键):
CREATE TABLE `screens2` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
那么如果你添加这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 1, '1', 'something.com', 'active');
然后这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 1, '1', 'something.com', 'finished');
然后这一行
INSERT IGNORE INTO screens2 ( unique_screen_id, userid, url, status)
VALUES ( 2, '1', 'something.com', 'finished');
将插入所有 3 行...
如果您这样创建 table:
CREATE TABLE `screens` (
`id` int NOT NULL AUTO_INCREMENT,
`unique_screen_id` varchar(20) DEFAULT NULL,
`userid` int DEFAULT NULL,
`status` enum('active','finished') DEFAULT 'active',
`url` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
unique(userid, url, status)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
只会插入两行,其中一行将被忽略。 P.S。如果您添加 UNIQUE 键,您将不会在插入语句中使用 IGNORE 关键字。
根据用户VBoka的建议,下面的demo给出了答案!
我需要结合使用 insert ignore 语句和 Unique 关键字!
谢谢!
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5d19c458568ef9204c257b7ef6096eab