2010-05-30 2 views
1

Я вставляю новые строки в таблицу SQLite, но я не хочу вставлять повторяющиеся строки.Как предотвратить обновление повторяющихся строк в базе данных SQLite?

Я также не хочу указывать каждый столбец в базе данных, если это возможно. Я даже не знаю, возможно ли это.

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

ответ

1

Ваши желания появляются противоречащие друг другу. В то время как ответ Андрея insert or replace поможет вам приблизиться к тому, что вы хотите, что, вероятно, должно разъяснить для себя, что вы действительно хотите.

Если вы не хотите указывать каждый столбец и хотите, чтобы (предположительно) частичная строка обновлялась, а не вставлялась, вероятно, вы должны посмотреть на unique constraint и знать, что неоднозначность ваших требований была также сделана SQL92 Committee.

3

Это один из первых шагов в дизайне и нормализации базы данных. Вы должны иметь возможность явно определить, что вы подразумеваете под дублирующей строкой , а затем поместите ограничение первичного ключа (или уникальное ограничение) на столбцы в таблице, которые представляют это определение.

Прежде чем вы узнаете, что вы укажете , повторите попытку, потому что вы должны определить (или решить) именно то, что таблица должна содержать. то есть, какой объект или абстракция реального мира для бизнес-домена каждая строка в таблице представляет или будет содержать данные для ...

После того, как вы это сделали, ограничение PK или уникальное ограничение остановит вас от вставки повторяющихся строк. . Тот же PK поможет вам найти повторяющуюся строку, когда она существует, и обновить ее значениями столбцов, не дублирующих символы (не-PK), которые отличаются от значений в существующей дублирующей строке. Только после того, как все это будет сделано, можно вставить или заменить (как определено SQL Lite) справкой процесса. Эта команда проверяет, существует ли дублирующаяся строка (*, как указано в ограничении PK), и если это произойдет, вместо того, чтобы вставлять новую строку, она обновляет не-PK определенные столбцы в этой строке со значениями, используемыми вашим запросом Replace.

+1

или можно было просто не думать о дизайне и использовать первое, что можно взломать в работе, а затем за полгода озадачиваться тем, почему первая реализация настолько хрупка и устойчива к обслуживанию, винить «DBM» и двигаться на следующую работу ...;) – msw

Смежные вопросы