Я хочу, чтобы столбец имени был здесь уникальным. Поскольку другие проблемные уникальные ключи не могут быть добавлены, их нельзя использовать при обновлении дубликатов ключей.
Я пытаюсь использовать выбор вставки, но не работает.
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;
Я вижу другой вопрос , но не получил ответ