【问题标题】:set default value to field if empty string is inserted through query如果通过查询插入空字符串,则将默认值设置为字段
【发布时间】:2020-01-02 11:43:05
【问题描述】:

所以我有一个表 A,其中包含一个 Z 列,其默认值设置为字符串“多样化”。 查询来自一个 php 脚本,该脚本从 jqueryAJAX 发布请求中获取数据。

如果查询收到用于插入/更新此列的空字符串,我希望我的数据库将 Z 列的相应字段设置为默认值。

我真的很想使用 mysql 功能来实现这一点,而无需使用任何更多自定义编码的 php 逻辑。 我已经在此处阅读了有关使用 WHEN/THEN 逻辑的信息: Set default value if empty string is passed MySQL 和这里 MySQL update CASE WHEN/THEN/ELSE

但这些并没有解释我如何永久配置表/列,使其不仅在接收 NULL 值时公开这种“默认”行为,而且在接收空字符串时。

此外: 如果我将一列设置为 NOT NULL 并为该列添加默认值,如果我尝试插入/更新到 NULL 值,查询是否会失败,或者数据库是否会翻转为默认值?

【问题讨论】:

  • 有些事情是出于正当理由。如果MySQL 列设置为“多样化”作为默认值,并且在INSERT/UPDATE 用户想要使用空白/空值,那么引擎必须以这种方式工作。您不想在PHP 端删除或设置默认值“多样化”是没有正当理由的。这是解决问题的最简单方法。

标签: mysql mariadb


【解决方案1】:

MySQL/MariaDB 会将值放入您在插入/更新语句中指定的列。如果您不提供值,将使用默认值(如果指定)。

如果你想使用默认值,即使插入/更新语句确实提供了一个值(NULL / 空字符串),你必须在某个地方有逻辑。选项是您将逻辑放在应用程序代码 (PHP) 中,或者如果您想在 MySQL/MariaDB 中执行,您可以使用触发器来检查新值并采取相应措施。

CREATE TRIGGER ins_A BEFORE INSERT ON A
FOR EACH ROW
BEGIN
  IF NEW.Z is null or NEW.Z='' THEN
    SET NEW.Z = 'diverse';
  END IF;
END;

UPDATE做同样的事情

【讨论】:

    【解决方案2】:

    请遵循以下2个案例:

    create table Test
    (
        a varchar(400)  not null default 'test',
        b varchar(10)
    )
        collate = utf8mb4_unicode_ci;
    
    Case 1: 
    INSERT INTO Test (a, b) VALUES (NULL, 'case1');
    => resul: error because column a required not null;
    
    Case 2:
    INSERT INTO Test (b) VALUES ('case1');
    => OK, and result of column a = defaul value = test
    

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2019-03-09
      • 2011-08-25
      • 2021-12-19
      • 2011-04-09
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多