我为什么插入记录时出现“重复条目”异常?

我收到此错误消息:

[FireDAC][Phys][MySQL] Duplicate entry ‘1111’ for key ‘PRIMARY’

尝试将数据插入数据库时​​.数据库中唯一的数据是主键为“ 0000”的元组,因此我知道主键不是另一个键的重复.数据已正确插入数据库,因此当主键不是重复项时,是否有任何方法可以阻止错误弹出?

我正在使用Delphi XE7,MySQL 6.2,FDConnection和FDQuery.我的代码是:

FDQuery1.SQL.Clear;
FDQuery1.SQL.Add(
  'Insert into Customer (' +
    'CustID,' +
    'Forename,' +
    'Surname,' +
    'Address,' +
    'PostCode' +
  ') ' +
  'Values (' +
    QuotedStr(CustID) + ',' + 
    QuotedStr(Forename) + ',' +
    QuotedStr(Surname) + ',' +
    QuotedStr(Address) + ',' +
    QuotedStr(Postcode) +
  ')'
);
FDQuery1.ExecSQL;
FDQuery1.Open;

解决方法:

您要执行两次相同的SQL语句.首先使用ExecSQL,然后使用Open.您仅应使用一个或另一个,具体取决于您的SQL语句是否实际返回任何结果.

就您而言,您已经编写了一个简单的INSERT查询,因此ExecSQL是正确的选择.请注意,如果将Open与该查询一起使用(不使用ExecSQL),则仍然会收到错误消息,因为“没有数据可打开”(可以这么说).

要强调该规则:如果SQL语句返回数据,请使用Open.这是一个示例,即使您的语句插入一行,您也将打开.

LQuery.SQL.Text :=
    'INSERT INTO Customer (CustId, CustomerName)'#13#10 +
    'VALUES ('+QuotedStr(ACustId)+','#13#10 +
               QuotedStr(ACustomerName)+');'#13#10 +
    'SELECT  CustId, CustomerName, DateAdded'#13#10 +
    'WHERE   CustId = '+QuotedStr(ACustId)
LQuery.Open;

如图所示,如果数据库分配了任何值(例如默认值,自动键,行版本),则可能要在插入后立即返回新行.如果是这种情况,那么您应该使用Open.

SIDE NOTE: I’ve stuck with a dynamic query as per your question. However, it’s generally advisable to go with a parametrised query or even stored procedure.

上一篇:FireDAC如何连接ORACLE数据库


下一篇:FireDAC 下FDMEMTable的的字段自动获取