在本地mysql上发生错误,但在RDS mysql上却没有

时间:2018-07-18 17:58:38

标签: php mysql amazon-web-services

我有一个在aws RDS(Live env)上运行的mysql插入查询,但在我的local(local env)上抛出错误。 在本地我正在使用mysql V-5.6

$sql = "INSERT INTO `users` (`id`, 
`name`, 
`email`,
`pass`)
values('','omi','omi@gmail.com','123123')

id不为null和auto_increment。 我在本地遇到的错误是“错误的整数值:”对于第1行的“ id”列 但是,当在实时环境中执行此操作时,所有数据都会插入表中。 我不明白这里到底发生了什么。请帮忙。谢谢。 用户表的DDL。 本地

CREATE TABLE `users`
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(256) DEFAULT '',
`email` varchar(256) NOT NULL,
`pass` varchar(256) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25986 DEFAULT CHARSET=utf8;

实时

CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(254) DEFAULT '',
`email` varchar(256) NOT NULL,
`pass` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26046 DEFAULT CHARSET=utf8;

2 个答案:

答案 0 :(得分:1)

我认为这些引号('')是错误的。当您要使用auto_increment字段进行插入时,必须在auto_increment字段位置使用null作为参数。 看看是否可行:

$sql = "INSERT INTO `users` 
    (`id`, `name`, `email`, `pass`)
    values(null,'omi','omi@gmail.com','123123');

编辑1

使用null不会产生任何错误,因为DBMS在内部准备接收此类参数。它知道生成下一个序列号是它的职责,如果没有,则首先插入0(在您的情况下为整数类型)。我知道在字段的DDL中定义“非null”,然后在DML插入语句中为该确切字段使用“ null”可能会造成混淆,但这只是使用auto_increment功能的正确方法。

来自documentation

  

如果将该列声明为NOT NULL,则还可以将NULL分配给该列以生成序列号。

此外,如果在语句中使用空字符串作为参数不会产生任何错误,则可能是因为RDS接口具有将空值转换为空值的内部函数。类似于MySQL中的nullif函数。

答案 1 :(得分:0)

您不能那样做。甚至不提'id'或给它提供空值。

$sql = "INSERT INTO `users` (
`name`, 
`email`,
`pass`)
values('omi','omi@gmail.com','123123')

OR:

$sql = "INSERT INTO `users` (`id`, 
`name`, 
`email`,
`pass`)
values('NULL','omi','omi@gmail.com','123123')