MySQL中自动递增id的重复问题



我的数据库有问题。表结构为:

表名:salessale_id(自动增量)日期(datetime)总(十进制)等。

我有两台电脑,一台是"服务器"。另一个是"客户",当我插入"销售"时有时数据库保存超过1条记录,这是一个随机的问题,因为有一天可能是正常的,只保存1条记录,但其他一天可能保存2条或更多的重复。

我的代码是:
qry1.SQL.Text := 'SELECT * FROM sales '
+ 'WHERE sale_id = 1';
qry1.Open;
qry1.Insert;
qry1.FieldByName('date').AsDateTime := Date;
qry1.FieldByName('total').AsFloat := total;
qry1.Post;
saleId := qry1.FieldByName('sale_id').AsInteger;
qry1.Close;
// Code to save sale details using saleId.

我正在使用Delphi 10.3 + ZeosLib 7.2.6-stable + MySQL 8.0

我打开了服务器的端口,所以我有一个直接连接到MySQL,我不知道会发生什么

希望你能帮助我

更新—谢谢你友好的回答,

@nbk是的,我已经做了。

@A Lombardo我使用了"where"获取1条记录,然后使用查询插入新记录类似于使用TTable,但不是加载孔表,而是获取一条记录,我可以插入(query。insert)

@TheSatinKnight不仅我得到两个记录,有时我得到3个或更多,但有可能是键盘工作不好,可以发送"enter">

@fpiette,我现在就做。

我将与你保持联系。

有比打开TZTable并在打开的表上插入数据更好的方法来完成插入操作。

作为另一种方法,在您的表单上删除2 TZQuery(不是TZTable)(我假设是TForm1 -酌情更改)。

假设名称为ZQuery1和ZQuery2。

将其连接属性设置为与TZTable相同,因此它使用相同的连接器。

ZQuery1设置。SQL属性'Insert into sales (date, total) values (:pdate,:ptotal)'//(无引号)设置ZQuery2。SQL属性select last_insert_id() as iddb

现在将下面的函数添加到表单的私有声明

TForm1 = class(TForm)
ZQuery1: TZQuery;  //added when dropped on form
ZQuery2: TZQuery;
private
{ Private declarations }
function AddNewSale(SaleDate: TDateTime; Total: Double): Integer;  //add this line
public
{ Public declarations }
end;

,然后将以下代码添加到表单的方法

var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.AddNewSale(SaleDate: TDateTime; Total: Double): Integer;
begin
ZQuery1.ParamByName('pdate').AsDateTime := SaleDate;
ZQuery1.ParamByName('ptotal').AsFloat := Total;
ZQuery1.ExecSQL; //*Execute* the Insert - Only "open" SQL that returns a result set
//now the record has been added to your DB
if ZQuery1.RowsAffected = 1 then //check to ensure it was inserted
begin
ZQuery2.Open;
try
Result := ZQuery2.FieldByName('iddb').AsInteger;
finally
ZQuery2.Close;
end;
end
else
result := -1;//indicate error by returning negative value
end;

现在在您想要插入记录的地方,只需调用这个函数:

var
ReturnValue: Integer;
begin
ReturnValue := AddNewSale(Date, total);
if ReturnValue < 0 then
//error happened
else
begin
//Everything worked
end;
end;

再次感谢您的友好回答。

最后的问题是键盘,它有一个问题,输入"键,所以当你按下它时,它会发送不止一个脉冲所以@ thesatinknight你的方法是正确的

@fpiette我创建了日志文件,我发现请求已经执行了两次或两次以上。

我知道对于程序员来说这可能是一件愚蠢的事情,因为我太晚禁用了按钮,对不起

@A Lombardo谢谢你的代码,我喜欢它比我的更好,我会使用它

相关内容

  • 没有找到相关文章

最新更新