【问题标题】:Only insert into table if it is empty只有在表为空时才插入到表中
【发布时间】:2019-04-23 10:03:19
【问题描述】:

如果只有表格为空,我想在表格中插入一行。我经历了这个Execute INSERT if table is empty?,但无法这样做。我使用 MariaDB 作为 rdbms。请帮助。提前致谢。

这是我的 sql 语法:

INSERT INTO `policy` (`policy1`, `policy2`, `policy3`, `policy4`)
    SELECT ('F', 'F', 'F', 'F')
    WHERE NOT EXISTS (SELECT * FROM `policy`) 

我的表结构是:

CREATE TABLE `policy` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `policy1` varchar(255) DEFAULT NULL,
  `policy2` varchar(255) DEFAULT NULL,
  `policy3` varchar(255) DEFAULT NULL,
  `policy4` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1

【问题讨论】:

  • 我尝试从选择中删除括号,但我仍然在工作台中遇到 sql 错误
  • Offtopic:增加列名,如policy1policy2 等很可能也是规范化的良好候选者。
  • @RaymondNijland 这些只是虚拟列名。稍后会更改。不过好点。

标签: mysql sql mariadb


【解决方案1】:

您也可以为此使用dual 表:

INSERT INTO `policy` (`policy1`, `policy2`, `policy3`, `policy4`)
    SELECT 'F', 'F', 'F', 'F'  -- no parentheses!
    FROM dual
    WHERE NOT EXISTS (SELECT * FROM `policy`) ;

dual 是一个单行的内置表格,专为这样的目的而设计。命名和构思来自 Oracle 数据库。

【讨论】:

  • 感谢您的提示!我搜索了为什么mysql和mariadb之间存在差异的参考。我发现了这一点:当您只选择计算值时可以使用 FROM DUAL,但需要 WHERE 子句,也许是为了测试脚本是否正确处理空结果集 - mariadb.com/kb/en/library/dual
【解决方案2】:

您可以使用以下解决方案:

INSERT INTO `policy` (`policy1`, `policy2`, `policy3`, `policy4`)
    SELECT * FROM (SELECT 'F' c1, 'F' c2, 'F' c3, 'F' c4)t
    WHERE NOT EXISTS (SELECT 1 FROM `policy`);

demo on dbfiddle.uk

【讨论】:

    【解决方案3】:

    你可以像这样使用存在:

    if not exists(select 1 from table)
    begin
        -- do stuff
    end
    

    【讨论】:

    • 不,你不能这不是 SQL Server (MSSQL),在普通 SQL 执行中允许使用这种语法。在 MySQL 中,这种语法只允许在触发器、函数和过程等存储程序上使用。所以这个语法会在 MySQL 和 MariaDB 上给出一个解析错误。
    【解决方案4】:
    INSERT INTO `policy` (`policy1`, `policy2`, `policy3`, `policy4`)
        Select * from (
        SELECT ('F', 'F', 'F', 'F')
        WHERE NOT EXISTS (SELECT 'F', 'F', 'F', 'F' FROM `policy`))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多