【问题标题】:How to add data into a table only if it doesnt already exist?仅当数据不存在时如何将数据添加到表中?
【发布时间】:2016-08-04 18:10:36
【问题描述】:

我曾考虑过使用 distinct 但我不太确定如何将其作为单个查询来提高代码效率,有没有办法?我基本上是在尝试检查是否已经存在数据条目,我正在尝试使用 BookingTime 进行检查。谢谢:)

这是我的 SQL 查询:

   string bookingInfo = "INSERT INTO Booking(BookingDate, BookingTime, CustomerID, EmployeeID, ServiceType, BookingLength) " +
                      "VALUES (@BookingDate, @BookingTime, @CustomerID, @EmployeeID, @ServiceType, @BookingLength) " +
                     "where not exists (SELECT 1 FROM Booking WHERE BookingTime = @BookingTime)";

我收到的错误:“附加信息:查询输入必须包含至少一个表或查询。”

【问题讨论】:

  • 如果发现重复,你想做什么?您想什么都不做,还是想用当前插入尝试中的值更新找到的记录?
  • 目前我在考虑是否有重复项,只需向用户显示一条消息,不要将重复项添加到数据库中。
  • 但是 BookingTime 是表的主键还是唯一索引?
  • 目前是日期/时间数据类型。

标签: c# mysql sql winforms


【解决方案1】:

最好的办法是让数据库做检查。

在表上创建唯一索引或约束:

create unique index unq_booking_bookingtime on booking(bookingtime);

注意:这是基于您的查询。在我看来,只有 bookingtime 定义唯一性似乎不太可能。

如果遇到重复,数据库将生成错误。您可以使用insert ignoreinsert on duplicate key update(后者是首选方法)来防止错误。

【讨论】:

  • 谢谢,我的sql编程很弱,要不要把where not exists去掉,换成你这行代码?
  • @JordanCoaten 。 . .是的。您应该让数据库进行检查——但请注意,您将在插入时收到错误。您可以通过使用where 来避免该错误(大部分时间)。
【解决方案2】:

WHERE 子句无效在显示的“INSERT ... VALUES”语句中无效。

MySQL 确实提供了 INSERT 语句的“INSERT ... SELECT ...”形式(不使用 VALUES 子句)。 SELECT 语句可以有 WHERE 子句,但要在 SELECT 中包含 WHERE 子句,必须有 FROM 子句。您可以使用内联视图(也称为派生表)返回单行,或者您可以使用内置的 Oracle 风格的虚拟表 DUAL 返回单行。 (我们不关心返回什么列,我们只需要返回一行。)

例如:

INSERT INTO Booking
( BookingDate
, BookingTime
, CustomerID
, EmployeeID
, ServiceType
, BookingLength
) 
SELECT @BookingDate
     , @BookingTime
     , @CustomerID
     , @EmployeeID
     , @ServiceType
     , @BookingLength
 FROM ( SELECT 1 ) i
WHERE NOT EXISTS 
      ( SELECT 1
          FROM Booking b 
         WHERE b.BookingTime = @BookingTime
      )

现在 SELECT 语句(可以与 INSERT 分开测试)将返回 0 行或 1 行。它返回的任何行都将传递给 INSERT。

作为“不存在”谓词的替代方案,您可以使用反连接模式:

SELECT @BookingDate
     , @BookingTime
     , @CustomerID
     , @EmployeeID
     , @ServiceType
     , @BookingLength
 FROM ( SELECT 1 ) i
 LEFT
 JOIN Booking b
   ON b.BookingTime = @BookingTime
WHERE b.BookingTime IS NULL

【讨论】:

  • "FROM(SELECT 1) i WHERE NOT EXISTS (SELECT 1 from Booking b WHERE b.BookingTime = @BookingTime)";我不太确定如何将其添加到我的程序中。
  • 此答案中的示例 SQL INSERT 语句是问题中显示的 SQL 文本的 替换(即要分配给 bookingInfo 的文字字符串。)
【解决方案3】:
string bookingInfo = "INSERT INTO Booking(BookingDate, BookingTime, CustomerID, EmployeeID, ServiceType, BookingLength) " +
                  "SELECT @BookingDate, @BookingTime, @CustomerID, @EmployeeID, @ServiceType, @BookingLength " +
                 " FROM Booking WHERE NOT EXISTS (SELECT * FROM Booking WHERE BookingTime = @BookingTime) LIMIT 1 "

试试这个SqlFiddle

【讨论】:

  • 我试过了,但它会创建一个循环,不断添加到我的数据库中。
  • 现在它说即使我添加了分号后仍然存在语法错误。
  • 用 SqlFiddle 示例更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2021-01-10
  • 2010-11-02
相关资源
最近更新 更多