如何使用SQL向DB表添加唯一值,以便现在将存在重复的行

时间:2012-01-16 15:21:01

标签: sql ms-access

这是我正在尝试的查询:

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驱动程序]查询输入必须至少包含一个表或查询。

3 个答案:

答案 0 :(得分:3)

在表格中为字段ProductName添加约束。这样,DBMS将不允许您插入具有现有ProductName的条目。

此外,建议使用序列填充特殊的主键字段(例如ProductId)。当您需要从其他表或DB之外的某个位置引用该产品时,它会更好。

P.S。:使用查询检查指定ProductName的行是否不存在然后插入新行实际上并不能使您从表中的重复产品中获益。在单独的事务中同时执行的两个这样的查询将能够成功地在表中插入行。因此,您将获得重复。

答案 1 :(得分:2)

使用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')

每当您尝试添加与现有产品名称相同的第二行时,都会引发错误。

答案 2 :(得分:0)

您的查询似乎没有很好的形成。 INSERT INTO表(列)VALUES(值)通常不允许where子句。

MS Access SQL的文档在这里(因为看起来你正在使用Access ODBC?)我没有看到任何迹象表明你可以使用这个逻辑。

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

您需要做的是首先使用您的java应用程序查询表以确定是否存在产品名称为“m”的记录,如果存在,则不要触发“插入”。如果dbms允许,您还可以向列添加约束。