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

如何使用SQL将唯一值添加到DB表中,以便现在有重复的行,sql,ms-access,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 =

这是我正在尝试的查询:

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


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

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


注意:使用一个查询来检查具有指定ProductName的行是否不存在,然后插入新行,实际上并不能避免表中的重复产品。在单独的事务中同时执行的两个这样的查询都将能够成功地向表中插入一行。因此,您将有一个副本。

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

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


注意:使用一个查询来检查具有指定ProductName的行是否不存在,然后插入新行,实际上并不能避免表中的重复产品。在单独的事务中同时执行的两个这样的查询都将能够成功地向表中插入一行。因此,您将有一个副本。

使用
插入。。。选择语法,而不是插入。。。值

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

但是,如果您不希望有两行具有相同的
Product.ProductName
,则只需将
Product.ProductName
列声明为
唯一
,并使用
插入。。。值
语法-如果不存在部分,则不使用语法,即可:

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

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

使用
插入。。。选择语法,而不是插入。。。值

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

但是,如果您不希望有两行具有相同的
Product.ProductName
,则只需将
Product.ProductName
列声明为
唯一
,并使用
插入。。。值
语法-如果不存在部分,则不使用语法,即可:

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

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

您的查询似乎格式不正确。INSERT INTO table(columns)VALUES(VALUES)通常不允许where子句

MS Access SQL的文档在这里(因为您似乎正在使用Access ODBC?),我看不到任何东西表明您可以在尝试使用此逻辑时使用此逻辑


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

您的查询似乎格式不正确。INSERT INTO table(columns)VALUES(VALUES)通常不允许where子句

MS Access SQL的文档在这里(因为您似乎正在使用Access ODBC?),我看不到任何东西表明您可以在尝试使用此逻辑时使用此逻辑


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

这是哪种RDBMS?这是哪种RDBMS?只有在这是Oracle DMB时才存在DUAL。@N West:正确。在MySQL中也是如此。@Al-Ammar:您最好在这里使用第二条建议-与约束不同,使用此类查询实际上不会保护您免受表中重复项的影响。正如@Andrei所指出的,添加一个
唯一的
(或
主键
)product.name上的约束是最好的选择。DUAL仅在这是Oracle DMBS时存在。@N West:正确。在MySQL中也是如此。@Al-Ammar:您最好在这里使用第二条建议-不像约束,使用这样的查询实际上不会保护您免受表中重复项的影响。正如@Andrei所指出的,在product.name上添加
UNIQUE
(或
主键
)约束是最好的方法。谢谢,这很有帮助,我将ProductName字段设置为唯一字段,它可以正常工作!谢谢,这很有帮助,我让ProductName字段变得独一无二,而且很有效!