sqlite插入数据,如果不存在则插入并获取id?

3

如果我使用 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的值?

谢谢。


使用该语句,如果表中不存在该记录,则会插入新记录。这是一个完全有效的语句。 - Lamak
我知道,我的问题是如何使它将id或id列的值带给我? - Data-Base
你想知道一行数据是被插入还是已经存在了吗?rowcount 不会告诉你吗? - Ben
2个回答

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

-1

你可以使用输出语句:

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

你能解释一下 "output inserted.name" 部分吗?我不确定我理解了它。 - Data-Base
好像我在解释问题时没有表达清楚,对此抱歉。现在我编辑了问题,希望现在清楚了! - Data-Base
它将以同样的方式工作,我用名字作为示例。尝试将其更改为ID,您将看到新的ID插入。 - Diego
抱歉,我不知道。我没有意识到 SQLite 标签。我在测试 SQL Server 2005。我很抱歉。 - Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接