2009-12-26 4 views
0

примерКак правильно вставить тег? SQL

tag { id PK, name TEXT }; 
item { id PK, exampleData LONG, tagId LONG //or foreign key depending on provider } 

Я использую SQLite и C#. Прилично к

  1. Начало транзакции
  2. Вставьте в теге
  3. Если затронутые строки = 0 сделать выбор, чтобы получить tag.PK в противном случае используйте last_insert_rowid
  4. Вставить элемент

или будет ли проблема с вышесказанным? Я планирую перейти на MySql или TSQL

ответ

3

можно условно вставить тег, если он не существует, как:

insert into tag (name) 
select 'NewTagName' 
where not exists (select * from tag where name = 'NewTagName') 

Затем, при вставке нового элемента, вы можете запросить идентификатор метки:

insert into item (exampleData, tagid) 
select 'NewData', (select id from tag where name = 'NewTagName') 

Этот метод Безразлично 't требуется получить идентификатор вставленной строки и будет работать нормально без транзакции.

+0

Или более кратко: «выберите« NewData », id из тега, где name = 'NewTagName'» – dkretz

+0

принято, потому что это поможет мне написать мой запрос, а также вы не сказали, чтобы выбрать сначала, что неправильно – 2010-01-07 09:40:25

1

Я вообще предпочитаю:

  1. начать транзакцию
  2. select from tag, чтобы определить, был ли тег уже существующий
  3. , если не существует, то insert into tag, и получить сгенерированный идентификатор (проверка, если вставка работала, конечно)
  4. я nsert into item
  5. совершить сделку (или откат, если произошла ошибка)

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

Но это, вероятно, не изменится ...

+0

Я забыл написать это, да, это уникально.Но мне сказали никогда не выбирать сначала, потому что это не операция записи, а другая транзакция может вставить ее после того, как я сделаю свой выбор, вызвав либо неудачу вставки (уникальную), либо неправильную логику от другой копии. – 2009-12-26 22:08:52

+1

@ acidzombie24: Но транзакция защитит вас От этого. Представьте, что вы пишете банковское приложение. Чтобы перенести деньги с моей учетной записи на свой аккаунт, я должен сначала «выбрать» доступный баланс. Если 'balance> = transfer_amount', то сделайте передачу, иначе нет. То же самое относится и к вашему делу. –

+0

На самом деле, нет. Я написал тестовый пример, и он терпит неудачу. http://www.pastie.org/757356 придерживайтесь этого в проект winform (веб, кажется, падает на меня, когда я пытаюсь это сделать). С Семафором нет условий гонки, и, как вы видите, результаты 6, а не 7. И они оба находятся в транзакции. – 2009-12-27 00:20:31

1

Единственная проблема, которую я вижу с вашей конструкцией, что каждый элемент может иметь только 1 тег. Это было ваше намерение?

В противном случае процедура ввода в порядке. Вам просто нужно проверить, существует ли тег уже, как предположил Паскаль Мартин.

+0

Хороший улов на единственном теге. Обычно я допускаю несколько, но в этом случае я не использую теги и не знаю, как я должен вставлять данные. – 2009-12-26 22:12:01

1

я думаю, что нет ничего плохого с вашим решением я считаю его правильным и использовать его

, но при переходе в MySql или Tsql использовать тот же раствор

1- вставить первый 2- возвращение @ @identity «ID» вставленной строки .....

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