文档库 最新最全的文档下载
当前位置:文档库 › MySql 主键自动增长

MySql 主键自动增长

MySql 主键自动增长
MySql 主键自动增长

MySql 主键自动增长

Mysql,SqlServer,Oracle主键自动增长设置

1、把主键定义为自动增长标识符类型

MySql

在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如:

createtable customers(id int auto_increment primarykey not null, name varchar(15));

insertinto customers(name) values("name1"),("name2");

select id from customers;

以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为:

由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。

Sql Server

在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。例如:

createtable customers(id int identity(1,1) primarykey not null, name varchar(15));

insertinto customers(name) values('name1'),('name2');

select id from customers;

注意:在sqlserver中字符串用单引号扩起来,而在mysql中可以使用双引号。

查询结果和mysql的一样。

由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。

以前经常会碰到这样的问题,当我们删除了一条自增长列为1的记录以后,再次插入的记录自增长列是2了。我们想在插入一条自增长列为1的记录是做不到的。今天跟同事讨论的时候发现可以通过设置SET IDENTITY_INSERT ON;来取消自增长,等我们插入完数据以后在关闭这个功能。实验如下:

use TESTDB2

--step1:创建表

createtable customers(

id int identity primarykey not null,

name varchar(15)

);

--step2:执行插入操作

insertinto customers(id,name) values(1,'name1');

--报错:An explicit value for the identity column in table 'customers' can only be specified when a column list is used and IDENTITY_INSERT is ON.

--step3:放开主键列的自增长

SETIDENTITY_INSERT customers ON;

--step4:插入两条记录,主键分别为1和3。插入成功

insertinto customers(id,name) values(1,'name1');

insertinto customers(id,name) values(3,'name1');

--step5:再次插入一个主键为2的记录。插入成功

insertinto customers(id,name) values(2,'name1');

--step6:插入重复主键,

--报错:Violation of PRIMARY KEY constraint 'PK__customer__3213E83F00551192'.Cannot insert duplicate key in object 'dbo.customers'.

insertinto customers(id,name) values(3,'name1');

--step7:关闭IDENTITY_INSERT

SETIDENTITY_INSERT customers OFF;

2、从序列中获取自动增长的标识符

Oracle

在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。

create sequence customer_id_seq increment by2 start with1

一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。

?curval:返回序列的当前值

?nextval:先增加序列的值,然后返回序列值

以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq序列。最后查询customers表中的id字段。createtable customers(id intprimarykey not null, name varchar(15));

insertinto customers values(customer_id_seq.nextval, 'name1');

insertinto customers values(customer_id_seq.nextval, 'name2');

select id from customers;

如果在oracle中执行以上语句,查询结果为:

通过触发器自动添加id字段

从上述插入语句可以发现,如果每次都要插入customer_id_seq.nextval的值会非常累赘与麻烦,因此可以考虑使用触发器来完成这一步工作。

创建触发器trg_customers

create or replace

trigger trg_customers before inserton customers for each row

begin

select CUSTOMER_ID_SEQ.nextval into :new.id from dual;

end;

插入一条记录

insertinto customers(name) values('test');

这是我们会发现这一条记录被插入到数据库中,并且id还是自增长的。

数据库主键和外键的作用

数据库主键和外键的作用 首先介绍一下什么是主键、什么是外键。 1 什么是主键外键 学生表(学号,姓名,性别,班级) ? 学号是一个主键 课程表(课程号,课程名,学分) 课程号是一个主键 成绩表(学号,课程号,成绩) 学号和课程号的属性组构成一个主键 成绩表中的学号不是成绩表的主键,不过是学生表的主键,成绩表的外键,同理课程号也是成绩表的外键 定义:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键 以一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表 2 外键的作用 外键用于保持数据一致性,完整性 主要目的是控制存储在外键表中的数据 3 主键的设计原则 1)主键应当是对用户没有意义的 2)主键应该是单列的,以提高连接和筛选操作的效率 复合键的使用通常出于两点考虑: a)主键应当具有意义-----这为认为的破坏数据库提供了方便 b)在描述多对多关系的连接表中可以使用两个外部键作为主键------该表可能成为其他从表的主表,并成为从表的主键的一部分,使得之后的从表包含更多的列 3)永远不要更新主键 4)主键不应该包含动态变化的数据(时间戳等) 5)主键应当由计算机自动生成 4 数据库主键选取策略 建立数据库的时候,需要为每张表指定一个主键(一个表只能有一个主键,但是可以有多个候选索引) 常见的主键选取方式有: 1)自动增长型字段 自动增长型主键会省略很多繁琐的工作,但在数据缓冲模式下,不能预先填写主键与外键的值 Order(OrderID,OrderDate)? //主键OrderID是自动增长型字段 OrderDetail(OrderID,LineNum,ProductID,Price)

Hibernate主键生成策略

Hibernate主键生成策略 本文介绍几种常见的主键生成策略,先通过xml文件配置这种方式来介绍主键生成策略,配置主键生成方式的方法如下配置文件: 1.Assigned 该主键生成方式是在保存一条数据的时候需要人为的通过程序为主键指定值,如果不指定主键值在第一次执行保存的时候,数据也能过插入到数据库并且程序也不会出现运行错误,但是表中该条数据的主键是0,当再次执行保存的时候,程序就会出现运行错误,具体错误如下:

虽然hibernate会执行一条插入的sql语句但是程序报错执行数据回滚,因此没有插入到数据表中。 因此,在使用assigned方式来生成主键的时候,程序中必须为主键指定值。 2.Increment 这种生成方式是主键依次增加1,在每次执行插入保存数据的时候,hibernate会先查询表中主键的最大值然后加1作为本次插入数据的主键值,我们可以通过程序运行控制台打印的sql语句就可以看出,每次执行插入方法的时候hibernate会执行两条sql语句,如下:

注意用该种生成策略的时候必须将主键的类型设定为long或者int的整数类型。 3.Identity 该种方法采用自动增长的策略生成主键,生成唯一标识。Hibernate 执行一条sql语句,如下: 但是需要注意的是该种生成策略需要依赖于底层数据库的特种,只能使用有主键自动增长功能的数据库,如mysql,在设计数据库主键的时候其类型也必须是long或者int的整数类型;使用oracle 数据库的时候该种策略就行不通,因为oracle是不支持主键自动增长的。 4.Sequence 该种方法采用序列的策略生成主键,这种方式也需要依赖于底层数据库,只适用于能生成序列的数据库,如oracle;在oracle中生成sequence的语句为: create sequence seq_name increment by 1 start with 1; 每次插入数据的时候指定主键的值为seq_name.nextval(); 如果不指定自己创建的序列,hibernate会给我们提供一个默认的序列,是hibernate_sequence,也需要在数据库中创建这个序列。

Oracle自动增长列的设置

SQL SERVER 和ACCESS 以及MYSQL 中,都有一种自增字段,通常被用来做主键或索引键,但是ORACLE 中,确并没有提供这种功能,但我们确经常需要这个功能,可以用以下方法解决, 一,如果你不在集群环境下使用,并且用到了hibernate,那么可以用hibernate提供的产生自动增长类型主键的increment策略,如下 在**.hbm.xml(hibernate映射文件)中配置如下 //该句指定使用hibernate自带的increment策略生成主键 这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可, 注意,increment 实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键,increment不能在集群环境下使用, 二,使用hibernate的sequence策略,在oracle中新建一个sequence,在hibernate中使用,如下 在**.hbm.xml(hibernate映射文件)中配置如下 //该句指定使用hibernate自带的sequence策略生成主键,TEST_SEQ是在数据库中新建的sequence的名称 TEST_SEQ 这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可, 三,以上两种方法都是通过hibernate实现的,下面给出ORACLE的一种实现方式 1. 建立SEQUENCE CREATE [ OR REPLACE ] SEQUENCE sequence_identity START WITH initial seed

关于数据库中的主键的自动增长

Mysql、SqlServer、Oracle主键自动增长的设置 1、把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: create table customers(id int auto_increment primary key not null, name varchar(15)); insert into customers(name) values("name1"),("name2"); 2、在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。例如: create table customers(id int identity(1,1) primary key not null, name varchar(15)); insert into customers(name) values("name1"),("name2"); identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。 3、Oracle列中获取自动增长的标识符 在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。 例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。方法一、 create sequence customer_id_seq INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10; 一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。curval:返回序列的当前值 nextval:先增加序列的值,然后返回序列值 create table customers(id int primary key not null, name varchar(15)); insert into customers values(customer_id_seq.curval, "name1"),(customer_id_seq.nextval, "name2"); 方法二、或者通过存储过程和触发器: 1、通过添加存储过程生成序列及触发器: create or replace PROCEDURE "PR_CREATEIDENTITYCOLUMN" (tablename varchar2,columnname varchar2) as strsql varchar2(1000); begin strsql := 'create sequence seq_'||tablename||' minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache'; execute immediate strsql; strsql := 'create or replace trigger trg_'||tablename||' before insert on '||tablename||' for each row begin select seq_'||tablename||'.nextval into :new.'||columnname||' from dual; end;'; execute immediate strsql; end;

主键ID设置为自动增加

--创建测试表 CREATETABLE student_table_test ( stt_id NUMBER(10) NOTNULLPRIMARYKEY, first_name VARCHAR2(10) NOTNULL, last_name VARCHAR2(10) NOTNULL, major VARCHAR2(10) NOTNULL ); --创建序列 CREATESEQUENCE student_table_test_autoinc_seq INCREMENTBY1--每次加几个 STARTWITH1--从1开始计数 NOMAXVALUE--不设置最大值 NOCYCLE--一直累加,不循环 CACHE10; --创建触发器 CREATEORREPLACETRIGGER student_table_test_authinc_tg BEFOREINSERTON student_table_test FOREACHROW BEGIN SELECT student_autoinc_seq.nextval INTO :new.stt_id FROM dual; END; 例子二 CREATETABLE rooms ( room_id NUMBER(10) NOTNULLPRIMARYKEY, building VARCHAR2(20), room_number NUMBER(10), number_seats NUMBER(10), DESCRIPTIONVARCHAR2(20) ); --创建序列 CREATESEQUENCE rooms_table_autoinc_seq INCREMENTBY1--每次加几个 STARTWITH1--从1开始计数 NOMAXVALUE--不设置最大值 NOCYCLE--一直累加,不循环 CACHE10; --创建触发器 CREATEORREPLACETRIGGER rooms_table_authinc_tg

数据库基笔记

一.数据库初始 1.需求分析 (1).优良的数据库设计 减少数据冗杂、避免数据维护异常、节约储存空间、高效访问 (2).设计流程 需求分析(数据--属性--两者各自特点) 逻辑设计(ER图逻辑建模) 物理设计(依据各数据库特点) 维护优化(新建、索引优化、大表拆分) (3).为何需求分析与内容 都是什么数据、特点、数据周期 实体及其间的关系(1v1、1Vn、nVn)、实体包含的属性、怎样标识唯一个体注:永久与不永久储存、分表与分库储存、归档与清理 2.逻辑设计 (1).ER图 矩形:实体集 菱形:关系集 椭圆:属性 线段:图像间连接 (2).设计范式(第一、第二、第三、BC) 第一范式(1NF):表中所有字段都是单一属性,不可再分,也就是说都是二维表,如用户信息不可再分为姓名与电话

第二范式(2NF):数据库表中不存在非关键字短发对任一候选关键字段的部分函数依赖。(部分函数依赖存在于组合关键字中:多个属性组合起来确定唯一物品)如 商品名称与供应商为组合关键字,但供应商决定了其电话,商品决定了价格等,故而但关键字的一定符合2NF,有组合关键字则不一定 第三范式(3NF):在2NF基础上,数据表中不存在非关键字段对任意候选关键字段的传递函数依赖。如 商品名称——分类——分类描述,即分类描述对商品名称有传递函数依赖 BC范式:在3NF基础上,数据库表中不存在任何字段对任一候选关键字段的传递函数依赖,即复合关键字间也不可有函数依赖。 (3).操作异常: 由于实体间有依存关系 (插入异常--更新异常、删除异常) (4).数据冗杂: 相同数据多次出现或可由其它列计算得到 3.物理设计 (1).做什么 选择合适数据库管理系统----定义数据库与表及字段的命名规范----根据所选的

关于数据库设计中主键问题的思考

关于数据库设计中主键问题的思考 文章摘要:数据库主键在数据库中占有重要地位。主键的选取策略决定了系统是否可靠、易用、高效。本文探讨了数据库设计过程当中常见的主键选取策略,并剖析了其做主键的优缺点,提出了相应的解决问题的方法。 关键字:自增标识GUID COMB 在基于关系型数据库设计时候,通常要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行记录的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除、修改时不出现错误。当然,其它字段可以辅助我们在执行这些操作时消除共享冲突,不是本文讨论的重点,不再赘述。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。所以数据库在设计时,主键起到了很重要的作用。常见的数据库主键选取方式有:自动增长式、手动增长式、UniqueIdentifier、联合式(复合式)、时间序列+随机数式、“COMB(Combine)”类型。 一、自动增长式 很多数据库设计者喜欢使用自动增长型字段,因为它使用简单。自动增长式允许我们在向数据库添加数据时,不考虑主键的取值,记录插入后,数据库系统会自动为其分配一个值,确保绝对不会出现重复。如果使用SQL Server数据库的话,我们还可以在记录插入后使用@@IDENTITY全局变量获取系统分配的主

键值。 尽管自动增长式字段会省掉我们很多繁琐的工作,但使用它也存在潜在的问题,那就是在数据缓冲模式下,很难预先填写主键与外键的值。假设有主辅两张表: Order(OrderID, OrderDate) 订单表 OrderDetial(OrderID, LineNum, ProductID, Price) 订单明细表Order 表中的OrderID是自动增长型的字段。假设现在需要我们录入一张订单,包括在Order表中插入一条记录以及在OrderDetail表中插入若干条记录。因为Order表中的OrderID是自动增长型的字段,那么我们在记录正式插入到数据库之前无法事先得知它的取值,只有在更新后才能知道数据库为它分配的是什么值。这会造成以下矛盾发生: 首先,为了能在OrderDetail的OrderID字段中添入正确的值,必须先更新Order表以获取到系统为其分配的OrderID值,然后再用这个OrderID填充OrderDetail表的OrderID列。最后更新OderDetail表。但是,为了确保数据的一致性,Order与OrderDetail在更新时必须在事务模式下进行的,即要么两张表同时同时更新成功、要么全部失败,显然它们是相互矛盾的。 其次,当我们需要在多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长式字段可能造成数据合并时的主键冲突及表关联关系的丢失。设想一个数据库中的Order表向另一个库中的Order

一个表可以创建多个主键吗

二、判断题 1.一个表可以创建多个主键吗。 2.创建唯一性索引的列可以有一些重复的值。 3.smallint 是SQL的数据类型。 4.SQL Server不允许字段名为汉字。 5.职称 in ('教授', '副教授'')与职称 = '教授' or 职称 = '副教授' 等 价吗? 6.如果规则当前绑定到某列或用户定义的数据类型,不能解除绑定能直接删 除规则? 7.在表中创建一个标识列(IDENTITY),当用户向表中插入新的数据行时,系 统自动为该行标识列赋值吗? 8.创建唯一性索引的列可以有一些重复的值? 9.固定数据库角色:db_datawriter 的成员删除本数据库内任何表中的数据 吗? 10.数据库设计前只需选择数据库分析设计人员。 11.恢复是利用冗余数据来重建数据库。 12.定义外键级级联是为了保证相关表之间数据的一致性吗? 13.存储过程的输出结果可以传递给一个变量。 14.视图具有与表相同的功能,在视图上也可以创建触发器。 15.SQL Server 2000不具有数据的导入与导出功能。 16.数据的完整性主要防范的对象是非法用户。 17.概念结构设计的工具是E—R模型。 18.设计好的数据库管理系统在投入使用后出现问题由使用方负责。 19.缺省情况下,所创建的索引是非聚集索引? 20.触发器是可在程序中被调用执行。 21.sa能否创建和删除数据库角色? 22.因为通过视图可以插入、修改或删除数据,因此视图也是一个实在表, SQL SERVER将它保存在syscommens系统表中。

23.guest用户必须关联一个登录账号才可以在数据库中创建。数据库中的非 guest用户账号都必须关联一个登录账号。 24.可以在企业管理器中修改数据库的名称。 25.恢复数据,可以在查询分析器中使用这样的命令:BACKUP DATABASE database_name FROM backup。 26.DELETE语句只是删除表中的数据,表本身依然存在数据库中。 27.在数据库中建立的索引越多越好。 28.在SQL SERVER中,触发器的执行是在数据的插入、更新或删除之前执行的。 29.通配符“_”表示某单个字符。 30.数据库不允许存在数据冗余。 31.每一个服务器必须属于一个服务器组。一个服务器组可以包含0个、一个或 多个服务器。 32.在SQL Server系统中,数据信息和日志信息不能放在同一个操作系统文件 中。 33.在使用子查询时,必须使用括号把子查询括起来,以便区分外查询和子查 询。 34.存储过程是存储在服务器上的一组预编译的Transcat-SQL语句。 35.创建触发器的时候可以不是表的所有者或数据库的所有者。 36.设置惟一约束的列可以为空吗? 37.一个表可以创建多个主键吗? 38.SQL Server有数据备份功能但没有数据还原功能。 39.数据库是用来存放表和索引的逻辑实体。 40.ODBC是由Microsoft定义的一种数据库访问标准。 41.创建存储过程必须在企业管理器中进行。 42.触发器主要是通过表操作事件进行触发而被执行的。 43.SQL Server 自动为primary key约束的列建立一个索引。 44.SQL Server的数据库可以转换成Access数据库。 45.删除表时,表中的触发器被同时删除。 46.数据库的名称一旦建立就不能重命名。

MySql 主键自动增长

MySql 主键自动增长 Mysql,SqlServer,Oracle主键自动增长设置 1、把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: createtable customers(id int auto_increment primarykey not null, name varchar(15)); insertinto customers(name) values("name1"),("name2"); select id from customers; 以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为: 由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。 Sql Server 在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。例如: createtable customers(id int identity(1,1) primarykey not null, name varchar(15)); insertinto customers(name) values('name1'),('name2'); select id from customers; 注意:在sqlserver中字符串用单引号扩起来,而在mysql中可以使用双引号。 查询结果和mysql的一样。 由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。

数据库主键外键设计原则 sky-v 博客园

数据库主键外键设计原则- sky-v - 博客园 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱, 而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注:这项原则对于那些经常需要在数据转换或多数 据库合并时进行数据整理的数据并不适用。 4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就

数据库主键与外键

聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。 主键: 关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途: 1. 惟一地标识一行。 2. 作为一个可以被外键有效引用的对象。 基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则: 1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。 2. 主键应该是单列的,以便提高连接和筛选操作的效率。 注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。 3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。 注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。 4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。 5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。 四、数据库主键选取策略 我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一

通过创建序列和触发器实现表的主键自增

本次的目的是通过创建序列和触发器实现表的主键自增。 首先创建序列,序列的语法格式为: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。 START WITH 定义序列的初始值(即产生的第一个值),默认为1。 MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。 MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。 CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。 CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。 删除序列的语法是DROP SEQUENCE 序列名; 假设有表TEST,其主键为TEST_ID,首先建立递增序列SEQ_TEST: create sequence SEQ_TEST increment by 1

oracle主键自动增长序列

select * from (select e.*,ROWNUM rn from (select * from emp order by empno) e) where rn between 1 and 10; select * from (select e.*,ROWNUM rn from (select * from emp order by empno) e where ROWNUM<=10) where rn>=1; 首先,你要有一张表! CREA TE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME V ARCHAR(25), PHONE V ARCHAR(10), ADDRESS V ARCHAR(50) ); 然后,你需要一个自定义的sequence CREA TE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXV ALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 NOCACHE -- 不建缓冲区 以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,假如你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下假如你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但假如遭遇意外情况如当机了或Oracle死了,则下次取出的seq值将和上次的不连贯.(假如连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!) 书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下: CREA TE TRIGGER "触发器名称" BEFORE INSERT ON example FOR EACH ROW WHEN (new.id is null) begin select emp_sequence.nextval into: new.id from dual; end; 打完收工!下面你就试试插入数据吧! INSERT INTO example(Name,phone,address) V alues('Cao','56498543','Heibei');

Oracle中如何创建使用SEQUENCES自增序列

Oracle中如何创建使用SEQUENCES Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方. 下面介绍一下关于sequence 的生成,修改,删除等常用的操作: 1. 创建Sequence 使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限): CREATE SEQUENCE test_sequence INCREMENT BY 1 -- 每次加的个数据 START WITH 1 -- 从1开始计数 NOMAXVALUE-- 不设置最大值 NOCYCLE-- 一直累加,不循环 CACHE 10 ; [注意] 如果设置了CACHE值,ORACLE将在内存里预先放置一些sequence,以使存取速度更快。cache 里面的取完后,oracle自动再取一组到cache。但是,使用cache可能会跳号,当遇到数据库突然异常down掉(shutdown abort),cache中的sequence就会丢失. 因此,推荐在create sequence的时候使用nocache 选项。 2. 使用sequence: sequence.CURRVAL -- 返回sequence的当前值 sequence.NEXTVAL -- 增加sequence的值,然后返回sequence 值 [注意] 第一次NEXTVAL返回的是初始值; 随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。 CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。 一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。 sequence 存储在数据字典中,存储于user_sequences表

SQL数据库

单选题 1. SQL Server 2005不能在Windows XP中安装的版本是 A)企业版 B)标准版 C)开发版 D)简易版 本题答案正确,标准答案:A,您的答案:A。 2. 通常情况下,下列()系统无法安装SQL Server 2005企业版 A)Windows 2000 Professional B)Windows 2000 Server SP4 C)Windows 2000 Datacenter Edition SP4 D)Windows 2003 Server SP1 本题答案错误,标准答案:A,您的答案:。 3. 设置某个服务自动启动,可以在下面()工具中操作实现 A)Reporting Services配置 B)事件探查器(SQL Server Profiler) C)查询分析器 D)配置管理器(SQL Server Configuration Manager)本题答案错误,标准答案:D,您的答案:。 4. 下列哪个数据库文件对创建和正常使用数据库是必不可少的。 A)日志文件 B)主数据文件 C)次要数据文件 D)安装程序文件 本题答案错误,标准答案:B,您的答案:。 5. 在SQL Server2005中,事务日志文件的后缀是 A).mdf

B).ndf C).ldf D).mdb 本题答案错误,标准答案:C,您的答案:。 6. SQL Server默认的系统管理员是 A)user B)me C)owner D)sa 本题答案错误,标准答案:D,您的答案:。 7. SQL Server所采用的SQL语言称之为 A)A-SQL B)S-SQL C)T-SQL D)C-SQL 本题答案错误,标准答案:C,您的答案:。 8. 对应于三种类型的数据库文件,SQL Server建议采用的文件扩展名是 A).mdf,.ndf,.ldf B).mdf,.cdf,.idf C).cdf,.ndf,.idf D).cdf,.idf,.ldf 本题答案错误,标准答案:A,您的答案:。 9. 在新建一个数据库的时候,系统是以()为模板来建立新的数据库的。 A)master数据库 B)model数据库 C)tempdb数据库

几个常见数据库关于主键自动增加的设置

几个常见数据库关于主键自动增加的设置1、把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: create table customers(id int auto_increment primary key not null, name varchar(15)); insert into customers(name) values("name1"),("name2"); select id from customers; 以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为:id 1 2 由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。 在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。例如: create table customers(id int identity(1,1) primary key not null, name varchar(15)); insert into customers(name) values("name1"),("name2"); select id from customers;

查询结果和mysql的一样。由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。 2、从序列中获取自动增长的标识符 在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。 create sequence customer_id_seq increment by 2 start with 1 一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval 属性。 curval:返回序列的当前值 nextval:先增加序列的值,然后返回序列值 以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq 序列。最后查询customers表中的id字段。 create table customers(id int primary key not null, name varchar(15)); insert into customers values(customer_id_seq.curval, "name1"),(customer_id_seq.nextval, "name2"); select id from customers; 如果在oracle中执行以上语句,查询结果为: id

关于数据库主键和外键

关于数据库主键和外键 一、什么是主键、外键 关系型数据库中的一条记录中有若干个属性 若其中某一个属性组(注意是组)能唯一标识一条记录 该属性组就可以成为一个主键 比如 学生表(学号 姓名 性别 班级) ,其中每个学生的学号是唯一的,学号就是一个主键,课程表(课程编号,课程名,学分) 。其中课程编号是唯一的,课程编号就是一个主键。成绩表(学号,课程号,成绩) 。 成绩表中单一一个属性无法唯一标识一条记录 学号和课程号的组合才可以唯一标识一条记录 所以学号和课程号的属性组是一个主键。 成绩表中的学号不是成绩表的主键 但它和学生表中的学号相对应。并且学生表中的学号是学生表的主键 则称成绩表中的学号是学生表的外键。 同理成绩表中的课程号是课程表的外键定义主键和外键主要是为了维护关系数据库的完整性。 总结一下 1.主键是能确定一条记录的唯一标识 比如 一条记录包括身份正号 姓名 年龄。 身份证号是唯一能确定你这个人的 其他都可能有重复 所以 身份证号是主键。 2.外键用于与另一张表的关联。是能确定另一张表记录的字段 用于保持数据的一致性。 比如 A表中的一个字段 是B表的主键 那他就可以是A表的外键。 二、主键、外键和索引的区别 主键、外键和索引的区别? 主键外键索引 定义:唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键,外键可以有重复的,可以是空值该字段没有重复值,但可以有一个空值。 作用:用来保证数据完整性用来和其他表建立联系用的是提高查询排序的速度。 个数:主键只能有一个一个表可以有多个外键一个表可以有多个惟一索引。 聚集索引和非聚集索引的区别? 聚集索引一定是唯一索引。但唯一索引不一定是聚集索引。 聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。 三、数据库中主键和外键的设计原则 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物

数据库常用语句

一、基础 1、说明:创建数据库 create database database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device use master exec sp_addumpdevice 'disk', 'testback', 'c:\mssql7backup\mynwind_1. dat' --- 开始备份 backup database pubs to testback 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: a:create table tab_new like tab_old (使用旧表创建新表) b:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 alter table tabname add column col type 注:列增加后将不能删除。db2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:alter table tabname add primary key(col) 说明:删除主键: alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….)删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1

相关文档
相关文档 最新文档