mysql无法插入因为没有默认值?

Joh*_*ohn 11 mysql

我有两个具有完全相同模式的表.我可以插入一个表而不是另一个表.失败的人抱怨没有默认值.这是我对表的创建语句

CREATE TABLE `t_product` (
  `product_id` varchar(10) NOT NULL,
  `prod_name` varchar(150) DEFAULT NULL,
  `price` decimal(6,2) NOT NULL,
  `prod_date` date NOT NULL,
  `prod_meta` varchar(250) DEFAULT NULL,
  `prod_key` varchar(250) DEFAULT NULL,
  `prod_desc` varchar(150) DEFAULT NULL,
  `prod_code` varchar(12) DEFAULT NULL,
  `prod_price` decimal(6,2) NOT NULL,
  `prod_on_promo` tinyint(1) unsigned NOT NULL,
  `prod_promo_sdate` date DEFAULT NULL,
  `prod_promo_edate` date DEFAULT NULL,
  `prod_promo_price` decimal(6,2) NOT NULL,
  `prod_discountable` tinyint(1) unsigned NOT NULL,
  `prod_on_hold` tinyint(1) unsigned NOT NULL,
  `prod_note` varchar(150) DEFAULT NULL,
  `prod_alter` varchar(150) DEFAULT NULL,
  `prod_extdesc` text,
  `prod_img` varchar(5) NOT NULL,
  `prod_min_qty` smallint(6) unsigned NOT NULL,
  `prod_recent` tinyint(1) unsigned NOT NULL,
  `prod_name_url` varchar(150) NOT NULL,
  `upc_code` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

当我在database1中运行此语句时,它成功插入:

insert into t_product (product_id) values ('jlaihello');
Run Code Online (Sandbox Code Playgroud)

当我在database2中运行这个确切的语句时,我收到错误:

ERROR 1364 (HY000): Field 'price' doesn't have a default value
Run Code Online (Sandbox Code Playgroud)

为什么这个错误只发生在database2中?据我所知,database1和database2之间的区别是:

database1使用mysql Ver 14.14 Distrib 5.5.53,debian-linux-gnu(i686)使用readline 6.3

database2使用mysql Ver 14.14 Distrib 5.7.16,对于Linux(x86_64)使用EditLine包装器

如何使database2像database1一样?

编辑有数百个表受此影响.基本上我们将数据库移动到新服务器.我从db1做了一个mysqldump,并导入到db2中.t_product只是受此影响的表中的一个.我想避免手动修改数百个表的模式.我更喜欢"简单的开关",它会使db2表现得像db1.

t1f*_*t1f 21

ERROR 1364 (HY000): Field 'price' doesn't have a default value

price decimal(6,2) NOT NULL,

将price设置为null或指定默认值

编辑:

这是由STRICT_TRANS_TABLESSQL模式引起的.

打开phpmyadmin并转到MoreTab并选择Variables子菜单.向下滚动以查找sql​​模式.编辑sql模式并删除STRICT_TRANS_TABLES保存.

要么

您可以在数据库管理工具中运行SQL查询,例如phpMyAdmin:

-- verify that the mode was previously set:
SELECT @@GLOBAL.sql_mode;
-- update mode:
SET @@GLOBAL.sql_mode= 'YOUR_VALUE';
Run Code Online (Sandbox Code Playgroud)

要么

在mysql conf文件中找到看起来像这样的行:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

注释上面的行并重新启动mysql服务器

  • 谢谢。我打开了我的`/etc/mysql/my.cnf`然后我添加了行`[mysqld] sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION` (2认同)
  • 注意自我,我接着说:在[mysqld]的sql_mode = ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION`我/etc/mysql/mysql.cnf并重新启动mysql服务. (2认同)