mysql - 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);
}
我的逻辑如下:
- id 是自动递增的,
- 由 INSERT SELECT 从用户表中插入的 user_id
- start_date 是自动创建的
- 毕竟,使用php函数填充due_date字段
我希望表格能够正确填充,但是,我遇到了一个错误:
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 列为空,为什么我填满后无法填充它?
解决方案
您的第二个查询应该是 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()}';
(可能需要仔细检查语法)。
但是您的自动增量打破了这一点,因为您的密钥将始终是唯一的。否则,它将使用生成的到期日期从用户表中插入您的行,但如果用户已经存在,它将简单地更新到期日期。
推荐阅读
- c++ - 在 VS Code 中编译 C/C++
- c# - Unity3D:自定义资产的碰撞检测问题
- javascript - 更换视频时如何释放内存?
- java - java.lang.NoClassDefFoundError procrun
- angular - Angular 8 如何构建具有不同环境的应用程序
- spring-integration - 成功渠道没有选择正确的委托工厂
- flutter - 如何将 SingleChildScrollView 居中但使背景拉伸以填满屏幕?
- android - 为什么我的 Android Studio 游戏突然崩溃?
- isabelle - 如何在语言环境的假设中使用写在语言环境参数上的定义?
- swift - 如何使用 Swift 的授权服务验证本地 macOS 用户的密码?