mysql 字段值不能重复_mysql如何让两个字段数据都不能重复?

场景

我mysql里有3个表

1.车辆信息表carInfo

字段为:

carID,主键

2.终端信息表terminalID

字段为:

terminalID,主键

3.车辆与终端的中间表car_bind_terminal

carID,外键

terminalID,外键

任务(需求)

现在需要实现车辆与终端的一对一映射,让中间表里的carID和terminalID这两个字段都不能重复,否则添加数据时会失败。

比如,车辆与终端的中间表car_bind_terminal里边有这样一条数据,代表了车辆1号与终端1号的一对一映射。

carID terminalID

1 1

现在我想要插入分别插入3条数据,分别是(1,2)、(2,1)和(2,2)。

carID terminalID

1 1

1 2 插入失败,因为carID与第一条重复了

2 1 插入失败,因为terminalID与第一条重复了

2 2 插入成功,因为carID和terminalID都没有与第一条重复

理想中的最终结果应为:

carID terminalID

1 1

2 2

行动(解决方案)

方案1:从代码层面解决(正确方案)

添加数据时,先检查数据在数据库中是否重复,若没有,则添加这条数据,否则返回添加失败。

缺点:写法太丑,需要对数据库进行两次操作。

方案2:设置成两个唯一索引(正确方案)

将carID和terminalID设置为两个唯一索引,我这里用的是Navicat。

b211bb66dc0a78bde6c5ed9f0e300231.png

因为carID和terminalID是外键,本来就是两个一般索引,在这里我们只需要把这两个索引的类型从Normal设置成Unique就好了。

优点:以后业务变更,不再是一对一,可能变成一对多或是多对多,都能灵活更改。

缺点:多了个中间表,索引数也多了。

方案3:删掉中间表,把从表的主键作为主表的外键,并将外键设置成唯一索引(正确方案)

优点:比上个方案少了个中间表,索引也少一半(2变成1)。

缺点:若将来业务变更为多对多,就要大改。

方案4:设置成一个复合唯一索引(错误方案)

不要设置成复合唯一索引,因为它允许其中的部分字段重复。

不要像下图这样设置。

daa365fe9fe1cc14b47814173e201145.png

结果

成功解决,我用了方案2,因为改动工作量小。

总结

1.如果删除carInfo表里的1号车,car_bind_terminal里的(1,1)数据也会跟着删除。

2.就mysql来说(别的不清楚),设置外键时会自动添加一个一般索引(Navicat能看到),设置主键时会自动添加一个唯一索引(Navicat看不到,因为主键是特殊的唯一索引)。

3.复合主键允许其中的部分字段重复。比如复合主键(ID,Name),数据可以同时存在(1,张三)和(2,张三)。

参考

原文:https://www.cnblogs.com/ledphz/p/12285505.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值