如果某些字段重复,您可以将忽略插入 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)

Here is a demo

所以首先你像这样创建 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