как добавить уникальные значения в таблицу БД с помощью SQL, чтобы теперь были повторяющиеся строки - PullRequest
0 голосов
/ 16 января 2012

Это запрос, который я пытаюсь:

INSERT INTO Product (ProductName, Description, Brand, Size, Variety, Manufacturer, Family, Category, SubCategory ) 
VALUES ('m', 'm', 'm', 'm', 'm', 'm', 'm', 'm', 'm') 
WHERE NOT EXISTS (SELECT * FROM Product WHERE Product.ProductName = 'm')`

и это исключение, которое я получаю:

java.sql.SQLException: [Microsoft] [ODBC Microsoft Access Driver] Ввод запроса должен содержать хотя бы одну таблицу или запрос.

Ответы [ 3 ]

3 голосов
/ 16 января 2012

Добавить ограничение для поля ProductName в таблице. Таким образом, СУБД не позволит вам вставить запись с существующим ProductName.

Также рекомендуется заполнить специальное поле первичного ключа (например, ProductId) с помощью последовательности. Лучше, когда вам нужна ссылка на продукт из другой таблицы или из какого-либо места за пределами БД.

P.S .: использование запроса, который проверяет, не существует ли строка с указанным ProductName, а затем вставка новой строки фактически не спасает вас от дублирующихся продуктов в таблице. Два таких запроса, выполняемые одновременно в отдельных транзакциях, смогут успешно вставить строку в таблицу. В результате у вас будет дубликат.

2 голосов
/ 16 января 2012

Использовать INSERT ... SELECT синтаксис, а не INSERT ... VALUES:

INSERT INTO Product 
( ProductName, Description, Brand, Size, Variety, Manufacturer, 
  Family, Category, SubCategory 
) 
SELECT
    'm','m','m','m','m','m','m','m','m'
FROM dual 
WHERE not exists 
      (select * from Product where Product.ProductName='m')

Если это для MS-Access, то у вас нет таблицы dual. Вы можете либо создать фиктивную таблицу dual - только с одной строкой - и использовать ее впоследствии, либо использовать это:

INSERT INTO Product 
( ProductName, Description, Brand, Size, Variety, Manufacturer, 
  Family, Category, SubCategory 
) 
SELECT
    'm','m','m','m','m','m','m','m','m'
FROM 
    (SELECT TOP 1 * FROM a_table_with_at_least_one row) AS dummy
WHERE not exists 
      (select * from Product where Product.ProductName='m')

Если, однако, вы никогда не захотите иметь 2 строки с одинаковым Product.ProductName, тогда вы можете просто объявить столбец Product.ProductName как UNIQUE и использовать синтаксис INSERT ... VALUES - без части WHERE NOT EXISTS, просто штраф:

INSERT INTO Product 
( ProductName, Description, Brand, Size, Variety, Manufacturer, 
  Family, Category, SubCategory 
) 
VALUES
    ('m','m','m','m','m','m','m','m','m')

При попытке добавить вторую строку с тем же именем продукта, что и существующее, будет выдана ошибка.

0 голосов
/ 16 января 2012

Ваш запрос не выглядит правильно сформированным.INSERT INTO таблица (столбцы) VALUES (значения), как правило, не позволяют использовать предложение where.

Документация по MS Access SQL находится здесь (поскольку, похоже, вы используете Access ODBC?) Я ничего не вижучтобы указать, что вы можете использовать эту логику, когда пытаетесь это сделать.

http://office.microsoft.com/en-us/access-help/insert-into-statement-HP001032245.aspx

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

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