Вставлять в таблицу только в том случае, если значение уникально в неуникальной строке

Я пытаюсь выполнить этот sqlite-запрос к существующей базе данных и таблице:

INSERT INTO Actions (guide_id, user_id, action_type, action_date, article_id,  guide_name) VALUES (33, 1199180, 2, 1355829894, 2457, 'Amsterdam');

Это работает, но если я снова запущу то же самое, он будет вставлять повторяющиеся значения, которые не нужны.

Вот как выглядит таблица:

Описание таблицы

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

Теоретически я хочу что-то вроде:

IF x DOES NOT EXISTS IN article_id DO (INSERT INTO Actions (guide_id, user_id, action_type, action_date, article_id,  guide_name) VALUES (33, 1199180, 2, 1355829894, 2457, 'Amsterdam'));

Это возможно?


person Joakim Engstrom    schedule 18.12.2012    source источник


Ответы (4)


пытаться:

INSERT INTO Actions (guide_id, user_id, action_type, action_date, article_id,  guide_name)
VALUES (33, 1199180, 2, 1355829894, 2457, 'Amsterdam') WHERE NOT article_id = x;

Другим способом было бы определить article_id как ключ UNIQUE:

create unique index unique_name on Actions (article_id );

Дополнительную информацию можно найти в руководстве по sqlite.

person Kuf    schedule 18.12.2012
comment
Могу ли я ИЗМЕНИТЬ article_id, чтобы он был уникальным, не удаляя таблицу или не создавая другую таблицу? - person Joakim Engstrom; 18.12.2012
comment
конечно можешь, попробуй create unique index unique_name on Actions (article_id ); - person Kuf; 18.12.2012
comment
Создание уникального индекса фактически не изменяет таблицу, но создает индекс. Есть ли способ изменить таблицу, чтобы сделать article_id уникальным? - person Joakim Engstrom; 18.12.2012
comment
Неважно, я думаю, что неправильно понял, как работает индекс. Я создал индекс и поместил INSERT OR IGNORE INTO в начало оператора вставки. Теперь это работает. - person Joakim Engstrom; 18.12.2012

Может быть, что-то вроде этого?

CREATE TRIGGER delete_duplicates_articles
AFTER INSERT ON Article
BEGIN
   DELETE FROM Article 
   WHERE action_date NOT IN (SELECT MIN(action_date) 
                             FROM Article 
                             WHERE article_id = new.article_id)
   AND article_id = new.article_id;
END;
person missemisa    schedule 18.12.2012

Если вы хотите, чтобы article_id был уникальным, тогда article_id должен быть первичным ключом, а не action_id.

person Philipp    schedule 18.12.2012
comment
Эффекты ограничения уникальности такие же, но UNIQUE не то же самое, что PRIMARY KEY. - person Robin Kanters; 18.12.2012

Почему нельзя добавить ограничение UNIQUE?

ALTER TABLE Actions
ADD UNIQUE (article_id);
person Robin Kanters    schedule 18.12.2012
comment
Это не работает, так как вы не можете изменить столбец в SqLite. По крайней мере, я не в курсе. - person Joakim Engstrom; 18.12.2012