Mysql是唯一的主键。需要了解行为

Mysql是唯一的主键。需要了解行为,mysql,Mysql,起初是这样的 NumberRenamed INT NOT NULL AUTO_INCREMENT, CompanyName char(255) NOT NULL, RegistrationNumber char(255), .... PRIMARY KEY (NumberRenamed), UNIQUE KEY `CompanyName` (`CompanyName`), ... 查询是这样的 INSERT INTO TableName (NumberRenamed, CompanyName,

起初是这样的

NumberRenamed INT NOT NULL AUTO_INCREMENT,
CompanyName char(255) NOT NULL,
RegistrationNumber char(255),
....
PRIMARY KEY (NumberRenamed),
UNIQUE KEY `CompanyName` (`CompanyName`),
...
查询是这样的

INSERT INTO TableName (NumberRenamed, CompanyName, RegistrationNumber) VALUES
ON DUPLICATE KEY UPDATE RegistrationNumber = VALUES(RegistrationNumber), CompanyName = VALUES(CompanyName)
numberrename的值为1

CompanyName的值为NULL

RegistrationNumber的值为1

执行查询,获取

NumberRenamed | CompanyName | RegistrationNumber 
------------------------------------------------
     1        |   NULL      |   1
然后

numberrename的值为1

CompanyName的值为1

RegistrationNumber的值为1

而不是

NumberRenamed | CompanyName | RegistrationNumber 
------------------------------------------------
     1        |   1         |   1
得到

添加了
唯一键'numberrename'('numberrename'),
。现在一切正常


我假设
numberrename
是主键,所以如果重复值(如果查询中的值与表中的值相同),则在重复键上更新
。但不是为什么不呢?

我怀疑这是对自动增量的特殊处理。为什么在插入时指定自动递增字段,通常希望允许DB自动分配该字段。自动递增没有特殊原因。可能我使用了一个例子,其中是
自动增量
。您的意思是需要更改为
numberrename INT NOT NULL,
(删除
AUTO_INCREMENT
)?在任何情况下,所有这些都是有效的,我只想理解为什么示例模式与示例数据不兼容:您已将
CompanyName
定义为
notnull
,但随后为该列插入了一条带有
NULL
值的记录。如果从该列中删除了
notnull
属性,那么您的示例将完全按照您的预期工作:请参阅。只需注意。创建表的代码是CompanyName字符(255,但如果在phpMyAdmin导出表中,则获取CompanyNameCHAR(255)不为空`
NumberRenamed | CompanyName | RegistrationNumber 
------------------------------------------------
     1        |   NULL      |   1
     2        |   1         |   1