Mysql学习之constraint/key/primary key/unique/foreign key/constraint的关系

1.constraint就是约束的意思,在MySQL中约束的表现形式有:not null/ primary key/unique隐含有约束功能。

2.如果为一个字段创建了约束,除非这个字段是not null ,否则就是为了这个字段即创建了约束又创建了索引,也就是说primary key为主键创建了约束和索引,unique也是一样。

但是当primary key 与constraint 关键字搭配使用的时候,将会忽视constraint 所创建的约束名与索引,其约束名与索引名皆为primary,比如:create table jc_one (id int ,names varchar(10) ,primary key(id))和create table jc_one (id int ,names varchar(10) ,constraint   my_self_index primary key(id))执行结果是一样的,因此在使用primary key的时候就不需要使用constraint了。

而unique 则不一样,如果unique不与constraint 搭配使用,则约束与索引名都默认为字段名称,而当使用unique与constraint 配合使用时,其约束名称与索引名称结尾constraint定义的一样,create table jc_one (id int ,names varchar(10) ,unique(id))的约束名与索引为id,而create table jc_one (id int ,names varchar(10) ,constraint my_self_key unique (id))索引名与约束名都是my_self_key。

注:如何验证以上结论呢,在mysql下的有个information_schema的数据库,该数据库下有个table_constraints表与 STATISTICS表,这两张表里分别存放着数据库中所有表的约束名与索引名,所以我们可以通过查看这两个表的变化,去查看结果

3.key与index 一样,只创建索引,不创建约束

4.foreign key 是建立外键关系,其与constraint搭配使用也是一样的,当然如果你不使用constraint的话,数据库会自动为你生成一个默认的约束名称与索引名称。

### 解决MySQL中重复外键约束名 'n2' 的问题 在 MySQL 中,如果尝试创建具有相同名称的外键约束,则会引发错误。这是因为外键约束名称在同一数据库中必须是唯一的。以下是解决问题的方法: #### 方法一:删除已存在的同名外键并重新定义 可以通过先删除冲突的外键约束再重新定义来解决此问题。 1. **查询现有的外键约束** 使用以下 SQL 查询语句查看当前表中的所有外键及其名称: ```sql SELECT CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'your_database_name'; ``` 2. **删除冲突的外键** 如果发现有名为 `n2` 的外键存在,可以使用以下命令将其删除: ```sql ALTER TABLE your_table_name DROP FOREIGN KEY n2; ``` 这里需要注意的是,`n2` 是具体的外键名称[^3]。 3. **重新添加新的外键** 删除旧的外键之后,可以根据需求重新定义一个新的外键约束: ```sql ALTER TABLE your_table_name ADD CONSTRAINT new_fk_name FOREIGN KEY (column_name) REFERENCES referenced_table(column_name); ``` #### 方法二:修改新外键的名称 另一种方式是在新增加外键时指定不同的名称以避免命名冲突。 例如,在创建外键时显式设置其名称为其他不重复的名字: ```sql ALTER TABLE t_user ADD CONSTRAINT fk_newname FOREIGN KEY (dept_id) REFERENCES dept(id); ``` 这里通过更改 `CONSTRAINT` 名称为 `fk_newname` 来防止与现有外键 `n2` 发生冲突。 #### 方法三:建表阶段加入唯一性约束预防此类情况发生 为了减少后续维护成本以及潜在的数据一致性风险,在设计初期就应考虑好数据模型结构,并适当应用各种类型的约束条件。比如可以在建立关联关系前确认字段具备必要的属性如非空或者唯一等特性[^4]。 ```sql CREATE TABLE IF NOT EXISTS `t_department` ( `id` INT UNSIGNED AUTO_INCREMENT, `departmentName` VARCHAR(50), PRIMARY KEY(`id`) )ENGINE=INNODB; CREATE TABLE IF NOT EXISTS `t_employee`( `empID` INT UNSIGNED AUTO_INCREMENT , `empName`VARCHAR(50), `depID`INT UNSIGNED , PRIMARY KEY(empID ), UNIQUE(depID ), -- 添加唯一索引确保部门编号不会重复映射到员工身上 FOREIGN KEY depFK(depID ) REFERENCES t_department(id ) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=INNODB ; ``` 以上代码片段展示了如何利用唯一性和外键相结合的方式来构建更加健壮的关系型数据库架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值