数据库的主键和外键
大家好,菜鸟问几个问题,希望知道的朋友能给我解答一下。我看资料说数据库表的主键最好使用自动编号类型的,这样保证了主键的无重复性和免于维护。但是有一个问题,由于采用了自动编...
大家好,菜鸟问几个问题,希望知道的朋友能给我解答一下。
我看资料说数据库表的主键最好使用自动编号类型的,这样保证了主键的无重复性和免于维护。但是有一个问题,由于采用了自动编号,虽然主键不重复,但是其他数据内容容易重复。比如:现有数据表员工表
员工ID 员工姓名 性别 年龄 身份证号
1 张三 男 23 123456
2 李四 男 35 111000
3 张三 男 23 123456
对于这些数据,以员工ID为主键,虽然主键没有重复,但是很明显1 和 3 属于同一个人。导致了大量的数据冗余。请问这样情况如何避免呢?我以为用身份证作为主键为好,可是有点朋友说,身份证有18位和15位的,并且容易改动,所以不适合做主键。有请朋友给点答案。
二,主键和外键的关系中,我们往往希望外键显示不是主键的编号,而是主键的具体名称。比如员工表和部门表中,员工表里有个部门ID字段,作为外键用于和部门表相联。现在问题是,在输入员工资本资料的时候,不希望出现部门ID这样字段,不具有直观性,而是希望那个输入框能够使,部门名称。当然保存的时候部门名称和部门ID相对,还是保存部门ID在员工数据表里。请问这个在delphi有哪个控件可以实现这个功能?
盼望高手指点,不胜感激。 展开
我看资料说数据库表的主键最好使用自动编号类型的,这样保证了主键的无重复性和免于维护。但是有一个问题,由于采用了自动编号,虽然主键不重复,但是其他数据内容容易重复。比如:现有数据表员工表
员工ID 员工姓名 性别 年龄 身份证号
1 张三 男 23 123456
2 李四 男 35 111000
3 张三 男 23 123456
对于这些数据,以员工ID为主键,虽然主键没有重复,但是很明显1 和 3 属于同一个人。导致了大量的数据冗余。请问这样情况如何避免呢?我以为用身份证作为主键为好,可是有点朋友说,身份证有18位和15位的,并且容易改动,所以不适合做主键。有请朋友给点答案。
二,主键和外键的关系中,我们往往希望外键显示不是主键的编号,而是主键的具体名称。比如员工表和部门表中,员工表里有个部门ID字段,作为外键用于和部门表相联。现在问题是,在输入员工资本资料的时候,不希望出现部门ID这样字段,不具有直观性,而是希望那个输入框能够使,部门名称。当然保存的时候部门名称和部门ID相对,还是保存部门ID在员工数据表里。请问这个在delphi有哪个控件可以实现这个功能?
盼望高手指点,不胜感激。 展开
展开全部
(1)诚如你所说,自增ID做一般做主键,但一般不作为唯一标示的依据,可以加一列比如员工编码(添加数据的时候要确保唯一)作为判断是否为统一员工的依据,至于数据重复,要在添加数据的时候做好严重,如果已经存在相同的编码,则不能再次插入,确保数据的唯一性
(2)其实跟第一个问题是一回事,添加一个字段用户编码就解决问题了,至于delphi有哪个控件可以实现这个功能这个问题,这根控件没有关系,只要在数据库设置ID自动增长就可以了, 管理员在界面上添加信息时候,用户编码可以根据一定的规则确保唯一,可以有客户输入,也可以有程序自动生成,但必须验证其唯一性。你说的部门ID的问题看看dephi中有没有类似于下拉框的空间,我也好久没用不记得了,如果有的话直接使用就可以了,
(2)其实跟第一个问题是一回事,添加一个字段用户编码就解决问题了,至于delphi有哪个控件可以实现这个功能这个问题,这根控件没有关系,只要在数据库设置ID自动增长就可以了, 管理员在界面上添加信息时候,用户编码可以根据一定的规则确保唯一,可以有客户输入,也可以有程序自动生成,但必须验证其唯一性。你说的部门ID的问题看看dephi中有没有类似于下拉框的空间,我也好久没用不记得了,如果有的话直接使用就可以了,
展开全部
1,主键是聚集索引 不适合常修改 记录也不易太大,用数字自增是最佳的
至于别的列要唯一,加唯一约束即可。
2,程序里或sql语句做连接即可。
至于别的列要唯一,加唯一约束即可。
2,程序里或sql语句做连接即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
身份证号是很适合做主键的,因为它不重复,身份证号怎么可能容易改动。你见过有哪个人改过身份证号的吗?18位还是15位并不影响它做主键。
delphi我不懂,直接用sql把部门名称select 出来不就行了吗?
select 员工名称,部门名称
from 员工表 a,部门表 b
where a.部门id = b.部门id and a.员工id = '员工id'
delphi我不懂,直接用sql把部门名称select 出来不就行了吗?
select 员工名称,部门名称
from 员工表 a,部门表 b
where a.部门id = b.部门id and a.员工id = '员工id'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先呢。为何会有重复数据进入啊。。。。。
用省份证号呗。你朋友说省份证号居然会容易改动?你问他 他这辈子改过几次了?
一般 都用id自动增长的啦 或者 你用员工的工号不就解决问题了?
工号总不见得重复了吧。
用省份证号呗。你朋友说省份证号居然会容易改动?你问他 他这辈子改过几次了?
一般 都用id自动增长的啦 或者 你用员工的工号不就解决问题了?
工号总不见得重复了吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询