我有一个小脚本,我想在其中向数据库表插入一个新列。
这是文件的内容myscript_ddl.sql
:
START TRANSACTION;
ALTER TABLE e1qxp_productos ADD COLUMN `cierre_venta` TINYINT(4) NULL DEFAULT NULL;
COMMIT;
为了执行它,我通过命令行执行如下:
mysql -u usuario -pclave nombrebasededatos < myscript_ddl.sql
它向我抛出以下错误,并且不允许我添加该字段:
第 2 行的错误 1067 (42000):“start_date”的默认值无效
我已经从 PhpMyadmin 手动尝试过,并且发生了完全相同的事情,同样的错误。它还指的fecha_inicio
是数据库中的另一列不应该与新插入有任何关系的事实。
这是为了什么?我该如何解决?
编辑:我添加了表的定义
CREATE TABLE `e1qxp_productos` (
`id` int(11) UNSIGNED NOT NULL,
`state` tinyint(1) NOT NULL,
`nombre` varchar(255) NOT NULL,
`apellidos` varchar(255) NOT NULL,
`nif_cif` char(9) NOT NULL,
`direccion` varchar(100) NOT NULL,
`ciudad` varchar(100) NOT NULL,
`provincia` varchar(100) NOT NULL,
`cp` varchar(100) NOT NULL,
`tipo_cliente` enum('persona','empresa') DEFAULT 'persona',
`tipo_producto` tinyint(1) DEFAULT '-1',
`fecha_inicio` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`fecha_fin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`precio` float DEFAULT NULL,
`marca` varchar(255) DEFAULT NULL,
`enviado` tinyint(1) NOT NULL DEFAULT '0',
`process` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Indices de la tabla `e1qxp_productos`
--
ALTER TABLE `e1qxp_productos`
ADD PRIMARY KEY (`id`);
您遇到的问题是您默认使用的日期值。特别是您设置为'0000-00-00 00:00:00'的两个值
我建议您使用 CURRENT_TIMESTAMP 作为默认值。如果您在其他部分中的算法逻辑需要该值,您还可以输入最小的有效日期“1971-01-01 00:00:00”。
我希望该解决方案对您有用。
您遇到的问题是因为日期
0000-00-00 00:00:00
是“虚拟”日期TIMESTAMP
,在日期字段( 、DATETIME
、DATE
等)中使用时不会导致错误:在西班牙语中:
默认 SQL 模式在各个版本中一直在更改:
这意味着从 5.7 版开始,SQL 模式 (
sql_mode
) 激活选项NO_ZERO_DATE
并NO_ZERO_IN_DATE
防止在值或表定义中使用“零”日期。通过改变定义来解决
一切都表明您在以前的 MySQL 版本中创建了表,并且在更新之后,您使用的版本不允许您修改定义而不用
0000-00-00 00:00:00
真实的值替换该“虚拟”值,例如NULL
:定义是:
您可以在此链接上在线尝试所有这些。
改变值的解决方案
sql_mode
另一种选择是永久修改 的值
sql_mode
,使其像以前一样工作,方法是添加my.cnf
:或暂时: