【问题标题】:How can I access the last inserted row ID within a SQL script?如何访问 SQL 脚本中最后插入的行 ID?
【发布时间】:2009-11-30 20:14:54
【问题描述】:

我正在使用 SQLite,我有一个属性表和一个子属性表。每个子属性都使用 fkPropertyId 列指向其父级。现在,为了创建初始数据库,我有一个看起来像这样的脚本:

INSERT INTO property VALUES(1,.....);
INSERT INTO property VALUES(2,.....);
INSERT INTO property VALUES(3,.....);
   INSERT INTO subproperty VALUES(1,.....,3);
   INSERT INTO subproperty VALUES(2,.....,3);
   INSERT INTO subproperty VALUES(3,.....,3);
INSERT INTO property VALUES(4,.....);

现在,我想摆脱硬编码的 rowId,所以它会是这样的:

INSERT INTO property VALUES(NULL,.....);
INSERT INTO property VALUES(NULL,.....);
INSERT INTO property VALUES(NULL,.....);
   INSERT INTO subproperty VALUES(NULL,.....,X);
   INSERT INTO subproperty VALUES(NULL,.....,X);
   INSERT INTO subproperty VALUES(NULL,.....,X);
INSERT INTO property VALUES(NULL,.....);

其中 x 指的是属性表中最后插入的 rowId。现在是

(SELECT MAX(rowId) FROM property)

有没有更好(并且在技术上更准确)的方法来编写这个脚本?

【问题讨论】:

    标签: sqlite relational


    【解决方案1】:

    使用last_insert_rowid函数:

    SELECT last_insert_rowid();
    

    【讨论】:

    • 如何在三个连续插入中保持该值?
    • 只需先插入属性行,再插入子属性。如果您需要记住多个插入的属性 ID,请在执行子属性插入之前将其分配给变量。
    • 我的问题是这是一个 sqlite 脚本,据我所知,sqlite 不支持脚本中的用户变量
    【解决方案2】:

    嗯,我想出的解决方案使用了 Ben S 的 last_insert_rowid 函数:

    INSERT INTO property VALUES(NULL,.....);
    INSERT INTO property VALUES(NULL,.....);
    
       INSERT INTO subproperty VALUES(1,.....,-1);
       INSERT INTO subproperty VALUES(2,.....,-1);
       INSERT INTO subproperty VALUES(3,.....,-1);
    INSERT INTO property VALUES(NULL,.....);
    UPDATE subproperty SET fkPropertyId = (SELECT last_insert_rowid()) WHERE fkPropertyId=-1;
    
    INSERT INTO property VALUES(NULL,.....);
    

    不确定这是否是最好的方法,但它对我有用,而且它不使用任何额外的表来存储临时数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多