主键是必须的吗?

mytiger 2001-11-07 02:57:21
表一定要有主键吗?有和没有的好处?
...全文
693 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
marvellin 2001-11-16
  • 打赏
  • 举报
回复
凑凑热闹,我觉得问题蛮简单嘛?
Broadsea 2001-11-16
  • 打赏
  • 举报
回复
讨论这种问题简直是浪费时间
SE1 2001-11-16
  • 打赏
  • 举报
回复
to Haiwer(海阔天空):
sorry,写错了,实际上我想说的是:“不过,显式地指定一个主键是一个好的做法”(第三段),不小心写成“不过,不显式地指定一个主键是一个好的做法”,多写了一个“不”字。实在是对不起。
linqiang 2001-11-16
  • 打赏
  • 举报
回复
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吗?
linqiang 2001-11-16
  • 打赏
  • 举报
回复
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吗?
linqiang 2001-11-16
  • 打赏
  • 举报
回复
Haiwer(海阔天空)
"那你的SELECT * FROM TABLE WHERE F1=‘aa’AND F2=2就会查到两条记录,你的update TABLE set ... WHERE F1=‘aa’AND F2=2就更新两条记录,你无法单单更新第二条记录。"
没错啊,人家就是要求能有重复记录,查询的时候就是要查到两条记录,改的时候就是要同时更新两条记录啊!永远不会出现要”单单更新第二条记录“。所以我说:“永远都不会用到的ID”。用户要求的功能就是这么单调,你有什么办法?这时加ID有绝对的必要吗?
yanhe100 2001-11-16
  • 打赏
  • 举报
回复
有主键各个表之间就能有关系。这样就能很容易的建立起科学的视图。经备以后使用。
昵称被占用了 2001-11-15
  • 打赏
  • 举报
回复
高深,很难理解,好象是这也好,那也好,没有不好的!
SE1 2001-11-15
  • 打赏
  • 举报
回复
对于DBMS来说,主键是必需的,每一张表都有一个主键。
对于数据库设计者和使用者来说,主键不是必需的,也就是说,我们可以不显式地指定一个主键,这时不同的DBMS会按照各自的方式默认指定主键,例如将所有的属性联合起来作为联合主键(当然效率会有影响),或者如Oracle,使用内部的rowid作为主键。
不过,不显式地指定一个主键是一个好的做法,利于维护、理解,在某种程度上也对效率有帮助。主键的值可以我们自己生成,也可以交系统完成,如SQL Server中的id字段。
实际上,无论我们是否指定或定义主键,对于DBMS来说,主键都是必须的,那么还不如我们自己不显式地指定为好。就如某些语言中我们可以不显式地指定变量的类型(如Fortran、VB),系统一样可以处理(采用默认值),但还是自己指定的好,至少有利于维护、理解,对编译器来说也有帮助,也有利于提高效率。
linqiang 2001-11-14
  • 打赏
  • 举报
回复
to :Haiwer
设计数据库要看最终用户的需求。我那个小库要求允许有重复记录(只是输入时间不同),但又不会按输入时间查询。只要查一下"张三"什么时候输入,输入了几次:
SELECT * FROM table WHERE NAME="张三"
而保存人员信息的表是固定的,不许更改的,设不设主键都可以。
我承认这样做不规范,人员表是人家做好的,他没设我也懒得去纠正。:)
hawkcai 2001-11-14
  • 打赏
  • 举报
回复
在oracle中,如果是建立主从关系表,则主键是必须的。但是其他有些具体情况不一定非要加主键,这一方面视实际情况而定,一方面还要看所造成的意想不到的后果。
昵称被占用了 2001-11-14
  • 打赏
  • 举报
回复
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)作为复合主键。


linqiang 2001-11-14
  • 打赏
  • 举报
回复
这是能不能的问题,还是好不好的问题?
有主键是值得推荐的好做法!
没有主键是不好的,但是能实现的做法!
如 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吗?
只要能满足用户的要求就行了。虽然不规范。
mytiger 2001-11-14
  • 打赏
  • 举报
回复
to shizi_mhy(柿子) :一个内部的ID?那好理解吗?
gwolf 2001-11-14
  • 打赏
  • 举报
回复
gz,gz,gz
shizi_mhy 2001-11-14
  • 打赏
  • 举报
回复
我认为所有的表都应该有主键

我们的系统中有几张表是没有主键的
有的表只有一条记录
有的是有多条记录的
其中有个多条记录的表是实现系统的某些设置功能的
由于没有主键,系统实现功能依赖于这几条记录在数据库表中的物理顺序(初始化时插入数据是有顺序的)
如果想增加某种功能,在里面插入一条记录那以前的功能就乱了
我都无法想象当初设计的人是怎么想的
!$#$^%*&%^$^%$

我现在设计表时
如果逻辑上不存在明确的主键,我就要加一个内部的ID,作为唯一的主键

没有主键的表让我难以理解
linqiang 2001-11-13
  • 打赏
  • 举报
回复
当然有主键较好。但严格来说没主键也问题。我的库就有几个表,表之间也设定了关系,但完全没设主键,就用普通的字段做关联。性能差别完全看不出来,主要是记录太少(最大的表才几千条)。更新或者删除操作可用:
UPDATE ... WHERE NAME="张三"
DELETE ... WHERE NAME="张三"
当然设主键才是正规的做法,但我主要是说明没主键实际上是能实现的。
昵称被占用了 2001-11-13
  • 打赏
  • 举报
回复
to: linqiang(阿强)
没有主键,那有两个张三怎么办?
那样你在输入的时候,用户输入"李四",你就必须要查是不是有"李四",有就不能输入?
KingSunSha 2001-11-12
  • 打赏
  • 举报
回复
我想只有在很少的情况下不用设主键.
如果需要对一个表中的某行或者某些纪录进行更新或者删除操作的话,那主键是必须的,否则无法定位一条纪录.
愤怒对抗喳喳 2001-11-12
  • 打赏
  • 举报
回复
当某个表操作涉及到其他很多表,和其他很多表有关联,操作频繁,建议使用主见
加载更多回复(26)
MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧