MySQL名称的主键约束

Rob*_*cha 5 mysql sql constraints primary-key

数据定义语句:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
)
Run Code Online (Sandbox Code Playgroud)

的价值和目的是什么

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)

与此相反

PRIMARY KEY (P_Id)

MySQL的文档真的不说太多关于这个,除了这个

Mar*_*555 6

这与 MySQL 忽略CONSTRAINT pk_PersonID部分相同。您可以通过创建表然后转储它或发出SHOW CREATE TABLE Persons.

我猜它支持这种语法只是为了与其他 SQL 服务器兼容(但对于主键和其他本地键忽略它)并且不存储其信息(约束名称)。

然而,对于外键的使用,该CONSTRAINT关键字也在 MySQL 中使用。

mysql> CREATE TABLE test.Persons (
    -> P_Id int NOT NULL,
    -> LastName varchar(255) NOT NULL,
    -> FirstName varchar(255),
    -> Address varchar(255),
    -> City varchar(255),
    -> CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
    -> );
Query OK, 0 rows affected (0.50 sec)

server$ mysqldump -p test Persons
Enter password:
--
-- Table structure for table `Persons`
--
DROP TABLE IF EXISTS `Persons`;
CREATE TABLE `Persons` (
  `P_Id` int(11) NOT NULL,
  `LastName` varchar(255) NOT NULL,
  `FirstName` varchar(255) DEFAULT NULL,
  `Address` varchar(255) DEFAULT NULL,
  `City` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`P_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

这里还有一个测试来证明 MySQL 不会将约束名称存储在任何地方,并且在打印错误时也不使用它(正如其他 SQL 服务器所提到的那样约束命名的目的是什么

mysql> insert into Persons (P_Id) values(1);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into Persons (P_Id) values(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)