Вставьте, если не существует, нет уникального ключа - PullRequest
0 голосов
/ 26 марта 2020

Я хочу, чтобы столбец имени был здесь уникальным. Поскольку другие проблемные уникальные ключи не могут быть добавлены, их нельзя использовать при обновлении дубликатов ключей.

Я пытаюсь использовать выбор вставки, но не работает.

INSERT INTO test2 (NAME, hotStatus)
SELECT 'A', 1 WHERE NOT EXISTS (SELECT 1 FROM test2 WHERE NAME = 'A' LIMIT 1);

Таблица:

CREATE TABLE `test2` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10),
  `hotStatus` tinyint(1),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
@Test
public void testInsert() throws InterruptedException {
    final int COUNT = 20;

    Thread[] ta = new Thread[COUNT];
    for (int i = 0; i < COUNT; i++) {
        int hotStatus = i % 2;
        ta[i] = new Thread(() -> getConn()
                .update("INSERT INTO test2 (NAME, hotStatus) " +
                        "SELECT 'A', ? WHERE NOT EXISTS (SELECT 1 FROM test2 WHERE NAME = 'A' LIMIT 1);", 
                        hotStatus));
    }
    for (Thread t : ta) {
        t.start();
    }
    for (Thread t : ta) {
        t.join();
    }
}

Таблица пуста перед запуском теста. После запуска этого теста в test2 появилось еще десяток данных.

id  name hotStatus
3   A    1
4   A    0
5   A    0
6   A    0
7   A    1

Я пытаюсь выбрать для обновления, но не могу заблокировать его.

select * from test2 where name = 'A' for update;

Я вижу другой вопрос , но не получил ответ

1 Ответ

0 голосов
/ 26 марта 2020

Не удается найти никаких проблем (за исключением превышения LIMIT в подзапросе).

INSERT INTO test2 (NAME, hotStatus)
SELECT @name, 1 
WHERE NOT EXISTS ( SELECT 1 
                   FROM test2 
                   WHERE NAME = @name );

, где переменная @name используется для вставки значения name (литерал может использоваться как в вопросе).

скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...