【问题标题】:sqlite INSERT INTO ... WHERE NOT EXISTS and get the id?sqlite INSERT INTO ... WHERE NOT EXISTS 并获取 id?
【发布时间】:2012-03-02 00:53:16
【问题描述】:

即使我使用 INSERT INTO ... WHERE NOT EXISTS,是否也可以获得 id? 如何修改它,它会给我带来插入记录的 id 或已经存在的记录的 id?如果可能的话!

INSERT INTO Timeline (name, ts)
SELECT @name, @ts
WHERE NOT EXISTS (SELECT 1 FROM Timeline WHERE name=@name AND ts = @ts);

我有一列名为“id”的自动增量整数 如何获取 ID 的值?

干杯

【问题讨论】:

  • 使用该语句,如果新记录不存在于您的表中,它将插入新记录。这是一个完全有效的陈述
  • 我知道,我的问题是如何让它给我带来 id 或 id 列的值?
  • 您想知道是否插入了一行或是否已经存在一行?行数不会告诉你吗?

标签: sql sqlite select insert system.data.sqlite


【解决方案1】:

您保证 (name,ts) 是唯一的,所以这应该可以解决问题。

INSERT INTO Timeline (name, ts)
SELECT @name, @ts
WHERE NOT EXISTS (SELECT 1 FROM Timeline WHERE name=@name AND ts = @ts);

SELECT id, name, ts from TimeLine
WHERE name=@name AND ts = @ts

【讨论】:

    【解决方案2】:

    你可以使用输出子句:

    insert into Timeline output inserted.name 
    SELECT @name, @ts
    WHERE NOT EXISTS (SELECT 1 FROM Timeline WHERE name=@name AND ts = @ts);
    

    你也可以在更新中做到这一点

    update Timeline 
    set name = @name
    output deleted.name as OLD_NAME, inserted.name as NEW_NAME
    

    已编辑:

    运行这个你就明白了:

    create table Timeline(
    id int not null primary key identity(1,1),
    name varchar(50),
    ts varchar(50))
    
    insert into timeline output inserted.ID
    values ('first record', 'ts') 
    --it will show 1
    
    
    insert into Timeline output inserted.ID 
    SELECT 'first record', 'ts'
    union select 'new record', 'ts'
    WHERE NOT EXISTS (SELECT 1 FROM Timeline WHERE name='first record' AND ts = 'ts')
    --ir will show 2 because the 1 already exits
    

    【讨论】:

    • 你能解释一下“输出插入的名称”部分吗?请注意我是否理解
    • 看来我解释的不是很清楚,抱歉,现在我编辑了问题,希望现在清楚了!
    • 它的工作方式相同,我以名称为例。尝试将其更改为 ID,您将看到插入的新 ID
    • 对不起,我不知道。我没有意识到 sqlite 标签。在 sql server 2005 上进行测试。我很抱歉
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2016-10-08
    相关资源
    最近更新 更多