TO:Haiwer(海阔天空)
“允许出现两条F1=‘aa’AND F2=2,那你的SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2就会查到两条记录,你的update TABLE set ... WHERE F1=‘aa’AND F2=2就更新两条记录,你无法单单更新第二条记录。”
对啊,人家就是要求能有重复记录,查询的时候就是要查到符合这样条件的多条记录,改的时候就是要同时更新多条记录,其他功能一概不需要,永远不会“单单更新第二条记录”。所以我说“永远都不会用到的ID”。你能怎么办?人家的库就是这么简单,功能就是要这么单调,我要再加功能人家说“画蛇添足”不需要!其实人家本来的工作就是又简单又单调的。你又有什么好办法呢?人家不要欣赏你的编程技巧,只要实现他的要求,减轻他的劳动。我的目的也不是去参赛,是给他用。你说还要这样非加上ID吗?
TO:Haiwer(海阔天空)
“允许出现两条F1=‘aa’AND F2=2,那你的SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2就会查到两条记录,你的update TABLE set ... WHERE F1=‘aa’AND F2=2就更新两条记录,你无法单单更新第二条记录。”
对啊,人家就是要求能有重复记录,查询的时候就是要查到符合这样条件的多条记录,改的时候就是要同时更新多条记录,其他功能一概不需要,永远不会“单单更新第二条记录”。所以我说“永远都不会用到的ID”。你能怎么办?人家的库就是这么简单,功能就是要这么单调,我要再加功能人家说“画蛇添足”不需要!其实人家本来的工作就是又简单又单调的。你又有什么好办法呢?人家不要欣赏你的编程技巧,只要实现他的要求,减轻他的劳动。我的目的也不是去参赛,是给他用。你说还要这样非加上ID吗?
Haiwer(海阔天空)
"那你的SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2就会查到两条记录,你的update TABLE set ... WHERE F1=‘aa’AND F2=2就更新两条记录,你无法单单更新第二条记录。"
没错啊,人家就是要求能有重复记录,查询的时候就是要查到两条记录,改的时候就是要同时更新两条记录啊!永远不会出现要”单单更新第二条记录“。所以我说:“永远都不会用到的ID”。用户要求的功能就是这么单调,你有什么办法?这时加ID有绝对的必要吗?
to :Haiwer
设计数据库要看最终用户的需求。我那个小库要求允许有重复记录(只是输入时间不同),但又不会按输入时间查询。只要查一下"张三"什么时候输入,输入了几次:
SELECT * FROM table WHERE NAME="张三"
而保存人员信息的表是固定的,不许更改的,设不设主键都可以。
我承认这样做不规范,人员表是人家做好的,他没设我也懒得去纠正。:)
to:linqiang(阿强)
你举的例子应该这样理解:
情况1、允许出现两条F1=‘aa’AND F2=2,那你的SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2就会查到两条记录,你的update TABLE set ... WHERE F1=‘aa’AND F2=2就更新两条记录,你无法单单更新第二条记录。
情况2、不允许出现两条F1=‘aa’AND F2=2,那没有主键的时候,你必须在输入程序限制,但通过客户端管理加的记录有可能会造成数据的重复,这是应该把(F1,F2)作为复合主键。
这是能不能的问题,还是好不好的问题?
有主键是值得推荐的好做法!
没有主键是不好的,但是能实现的做法!
如 TABLE
f1 f2
aa 1
bb 2
cc 3
aa 2
cc 3
用SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2难道“无法定位一条纪录”?
在此表中加ID有什么意义吗?虽然加上ID主键能唯一地标识一条记录,但在用户看来ID=3和ID=5的记录含义是一样的,那区分开来有什么用呢?人家改的时候就是要求
UPDATE TABLE SET f2=0 WHERE f1='cc'
那你怎么办?还有必要加一个永远都不会用到的ID吗?
只要能满足用户的要求就行了。虽然不规范。
当然有主键较好。但严格来说没主键也问题。我的库就有几个表,表之间也设定了关系,但完全没设主键,就用普通的字段做关联。性能差别完全看不出来,主要是记录太少(最大的表才几千条)。更新或者删除操作可用:
UPDATE ... WHERE NAME="张三"
DELETE ... WHERE NAME="张三"
当然设主键才是正规的做法,但我主要是说明没主键实际上是能实现的。