【问题标题】:SQL insert into a table depending on values in the tableSQL 根据表中的值插入表中
【发布时间】:2016-03-08 10:23:45
【问题描述】:

我正在创建一个图书馆系统,每本书只有 1 个副本。用户将输入这本书和他们想要的日期。在系统将检查该书是否未为用户想要的日期保留之后。

如果变量不在表中,我正在尝试将数据插入表中。例如如果 id 等于 3 并且日期介于表中已有的两个日期之间,则不会输入信息。该表用于简单的预订系统。下面的代码是我所拥有的,但似乎不起作用,因此需要更改。我得到的错误低于代码。谢谢。

SELECT * 
FROM `table_name` 
INSERT INTO table_name (name, id, start_date, end_date, days)
VALUES ('test', '4', '0000-00-00', '1000-00-00', 3)
WHERE id != 3
AND start_date NOT BETWEEN 2016-03-31 AND 2016-03-05

这是我运行代码时遇到的错误:

 Static analysis:

9 errors were found during analysis.

Unrecognized keyword. (near "NOT" at position 203)
Unrecognized keyword. (near "BETWEEN" at position 207)
Unexpected token. (near "2016" at position 215)
Unexpected token. (near "-03" at position 219)
Unexpected token. (near "-31" at position 222)
Unrecognized keyword. (near "AND" at position 226)
Unexpected token. (near "2016" at position 230)
Unexpected token. (near "-03" at position 234)
Unexpected token. (near "-05" at position 237)
SQL query: Documentation

SELECT * FROM `table_name` INSERT LIMIT 0, 25 INTO table_name (name, id, start_date, end_date, days) VALUES ('test', '4', '0000-00-00', '1000-00-00', 3) WHERE id != 3 AND start_date NOT BETWEEN 2016-03-31 AND 2016-03-05

MySQL said: Documentation

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT LIMIT 0, 25 INTO table_name (name, id, start_date, end_date, days)' at line 3#

【问题讨论】:

  • 首先你的insert into - select语法不正确。
  • @Smudger 您的插入语句中不能有 where 子句,因为您正在插入数据

标签: mysql sql select insert-into


【解决方案1】:

你可能想要这样的东西:

INSERT INTO table_name (name, id, start_date, end_date, days)
SELECT name, id, start_date, end_date, days
FROM (SELECT 'test' AS name, 
             4 AS id, 
             '0000-00-00' AS start_date, 
             '1000-00-00' AS  end_date, 
             3 AS days) AS t
WHERE NOT EXISTS (SELECT *
                  FROM table_name
                  WHERE id = 3 AND start_date BETWEEN '2016-03-31' AND '2016-03-05')

此查询将在table_name 中插入指定的硬编码值987654325@ 不存在在同一个表中。

您可以根据实际需要修改WHERE 子句的谓词。

【讨论】:

  • 唯一的问题是,如果它具有相同的 id 并且在两个日期之间,它仍然会将数据输入到表中,这与我想要发生的相反。
  • @Smudger 恐怕我不明白你的实际要求。您要插入和id 以及表中已经 存在的日期?
  • 我想要做的是,如果一本书已经预订,那么这本书不能同时借阅。因此,如果日期介于已输入表中的日期之间,并且书籍 ID 是相同的。那么这本书就不能预约了。基本上它是一个图书馆,每本书只有一本。
  • @Smudger 在这种情况下,NOT EXISTS 似乎是您想要的:它可以防止插入重复记录。
【解决方案2】:

试试这个

SELECT * FROM `table_name` (INSERT LIMIT 0, 25 INTO table_name 
(name, id, start_date, end_date, days) 
VALUES ('test', '4', '0000-00-00', '1000-00-00', 3))
WHERE id != 3 AND start_date NOT BETWEEN '2016-03-31' AND '2016-03-05'

【讨论】:

    【解决方案3】:
    1. 您正在插入与您选择的表相同的数据。是你想要的吗?

    2. 是否只想在表格中插入VALUES ('test', '4', '0000-00-00', '1000-00-00', 3)?在那种情况下,为什么要使用where 子句。

    3. 如果你想根据你想要的条件从你的表中选择数据,那么你为什么要把VALUES ('test', '4', '0000-00-00', '1000-00-00', 3) 加入它呢?您需要单独的插入语句。

    4. 用于between 子句的值应在左侧具有较小的值,在右侧具有较大的值。你也应该理想地对它进行类型转换。 start_date NOT BETWEEN STR_TO_DATE('2016-03-05','%Y-%m-%d') and STR_TO_DATE('2016-03-31','%Y-%m-%d')

    5. 最后但同样重要的是,insert 子句位于 select 之前。

    请根据这些输入回答问题和/或更改您的查询。

    编辑:基于 OP cmets,生成了 2 个插入语句。您可以使用union 并从dual 中选择值,而不是使用statement2,但我不确定mysql 在这种情况下的日期类型转换。

    Statement1:

    INSERT INTO table_name (name, id, start_date, end_date, days)
    SELECT * 
    FROM `table_name` WHERE id != 3
    AND start_date NOT BETWEEN STR_TO_DATE('2016-03-05','%Y-%m-%d')  and STR_TO_DATE('2016-03-31','%Y-%m-%d')
    

    Statement2

    insert into table_name (name, id, start_date, end_date, days)
    values ('test', '4', '0000-00-00', '1000-00-00', 3)
    

    【讨论】:

    • 1) 是的,我想插入到同一个表中,2) 是的,数据会被输入,但这只是一个例子,3) 我认为应该这样做
    【解决方案4】:

    原来我只需要在代码的不同部分分别做这两件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2022-11-01
      • 2015-05-12
      • 1970-01-01
      • 2023-03-17
      • 2013-12-03
      相关资源
      最近更新 更多