2012-05-21 57 views
0

我只是想知道做到这一点的最佳方式。SQL独特列组合

我有一个包含2个表的数据库。

首先表

id - primary key 
title 

二表

id - primary key 
first_id 
order 

我在想,如果插入如果然后更新first_id和秩序的组合存在时是什么,以确保最好的办法别插入?

例如,如果我尝试插入一个记录到第二个表first_id = 10和order = 1,并且已经存在,则更新而不是插入新的记录。我读了一些关于使各列独特组合的地方,但不知道如何去做。

编辑:对不起,我忘了,更不用说使用MySQL

+0

如果您将我们与数据库平台挂钩,我可以为您提供另一种更高效的解决方案。最快的是执行更新检查,如果它是0,则执行插入操作,影响多少行。语法与大3不同,SQL Server具有更高效的方式。 – JStead

+0

使用MySQL - 我看到这个http://stackoverflow.com/questions/707767/sql-unique-record-not-column 你可以设置更新以及?假设sql -server为 – hooligan

回答

2

假设sql -server,即时通讯......

if exists (select 1 from table2 where [email protected] and [email protected]) 
begin 
    update table2 set(...) 
end 
begin 
insert into table2 select ... 
end 

请确保first_id是外键的表1的id。

+0

。你是说MySQL吗? – hooligan

+0

@hooligan nop。我的意思是MicrosoftSqlServer –

0

对于MSSQL,你可以使用这样的事情:

IF NOT EXISTS (SELECT id from Second Table WHERE first_id = 10 AND order = 1) 
BEGIN 
    INSERT INTO Second Table (first_id, order) VALUES (10, 1) 
END 
ELSE 
BEGIN 
    UPDATE Second Table SET order = 1 WHERE first_id = 10 
END 

至于使其成为独特的,只是确保您不能插入这些值的两倍,但我认为它可能会更好tryint之前检查本插。 (两者的组合都是完美的,我猜)

你可以使first_id和order UNIQUE的组合来防止它。

0

如果你直接在表格中插入数据,你可以做一个类似于Royi答案的触发器来帮助你。

如果你想插入失败,当你尝试插入一对数据,或换句话说,如果你想做一个唯一的约束,也许这link会帮助你。

其他方法是通过存储过程插入数据并在插入前执行检查。

-Sadd

0

这种方式在更新场景中只能扫描一次表格。插入物仍然具有相同的性能。

UPDATE Second Table SET order = 1 WHERE first_id = 10 
if ROW_COUNT() = 0 
begin 
    INSERT INTO Second Table (first_id, order) VALUES (10, 1) 
end