首页 > 解决方案 > MySQL - 表的填充问题

问题描述

在从事学习项目时,我面临无法解决特定任务的问题。我找到了一种解决方法,但现在正在尝试消除对我的具体问题的缺乏理解,因此非常欢迎提出建议!

问题如下:

我有一个表 user_orders:

            CREATE TABLE `user_orders` (
                `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                `user_id` INT(11) UNSIGNED NOT NULL,
                `start_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
                `due_date` DATE NULL,

               CONSTRAINT `fk_user_orders_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
               ON UPDATE NO ACTION ON DELETE NO ACTION 
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

创建后我试图填充它(不要注意我在填充中使用的方法,我的目标是尽可能多地练习 MySQL 解决方案以获得全面的概述):

  public function run(): void
  {
    $queryString = /** @lang text */
        "
            INSERT INTO `user_orders` (
                `user_id`
            )
            SELECT
                `id`
            FROM 
                `users`;
        ";

    DB::statement($queryString);

    $queryString2 = /** @lang text */
        "
            INSERT INTO `user_orders` (
                `due_date`
            )
            VALUES
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}'),
                ( '{$this->generateDueDate()}')
        ";

    DB::statement($queryString2);
}

我的逻辑如下:

我希望表格能够正确填充,但是,我遇到了一个错误:

 SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a 
 default value (SQL: 
            INSERT INTO `user_orders` (
                `due_date`
            )
            VALUES
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06'),
                ( '2020-08-06')
        )

为什么我会看到此错误?due_date 列为空,为什么我填满后无法填充它?

标签: mysql

解决方案


您的第二个查询应该是 anUPDATE或者它还需要插入一个user_id值,因为它没有默认值。目前它正在尝试插入 10 个没有值的额外行user_id

您的第二个查询可能变为:

UPDATE `user_order` SET `due_date` = '{$this->generateDueDate()}'
WHERE `due_date` IS NULL

这将使用您生成的日期更新已添加的任何条目(或已经存在的具有空到期日期的条目)。

参考您关于 ON DUPLICATE KEY 的评论,您可能会有这样的查询

 INSERT INTO `user_orders` ( `user_id`, `due_date`)
     SELECT `id`, '{$this->generateDueDate()}'
       FROM `users` ON DUPLICATE KEY UPDATE `due_date`= '{$this->generateDueDate()}';

(可能需要仔细检查语法)。
但是您的自动增量打破了这一点,因为您的密钥将始终是唯一的。否则,它将使用生成的到期日期从用户表中插入您的行,但如果用户已经存在,它将简单地更新到期日期。


推荐阅读