【问题标题】:SQL Unique Column CombinationSQL唯一列组合
【发布时间】:2012-05-21 12:25:50
【问题描述】:

我只是想知道最好的方法。

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

第一个表

id - primary key
title

第二张表

id - primary key
first_id
order

我想知道在插入时是否存在 first_id 和 order 的组合是否存在然后更新 else 插入的最佳方法是什么?

例如,如果我尝试将一条记录插入第二个表 first_id = 10 和 order = 1 并且该记录已经存在,则更新而不是插入新记录。我在某处读到了有关使列组合独一无二的信息,但不知道该怎么做。

编辑:对不起,我忘了提到我正在使用 MySQL

【问题讨论】:

  • 如果您将我们与您的数据库平台挂钩,我可以为您提供另一个更有效的解决方案。最快的是执行更新检查有多少行受到影响,如果它是 0 然后执行插入。语法因大 3 而异,SQL Server 有一种更有效的方法。
  • 使用 MySQL - 我确实看到了这个stackoverflow.com/questions/707767/sql-unique-record-not-column 你能设置它来更新吗?

标签: mysql insert


【解决方案1】:

假设sql -server...

if exists ( select 1 from table2 where  id=@id and firstId=@firstid)
begin
  update table2 set(...)
end
begin
insert into table2 select ...
end

请确保 first_id 是 table1 的 id 的外键。

【讨论】:

  • 假设 sql -server。你是说 MySQL 吗?
  • @hooligan nop。我的意思是 MicrosoftSqlServer
【解决方案2】:

对于 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

至于使其独一无二,这只是确保您不能将这些值插入两次,但我认为最好在尝试插入之前检查一下。 (我猜两者的结合是完美的)

您可以将 first_id 和 order UNIQUE 组合起来以防止它。

【讨论】:

    【解决方案3】:

    如果您直接在表中插入数据,您可以制作一个触发器,类似于 Royi 的答案会帮助您。

    如果您希望在尝试插入一对数据时插入失败,或者换句话说,如果您想创建唯一约束,那么 link 可能会帮助您。

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

    -伤心

    【讨论】:

      【解决方案4】:

      这种方式在更新方案中只扫描一次表。插入的性能仍然相同。

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-20
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多