是否有可能使用一个序列为每个表生成初始值1的序列号(每个表应该使用一个序列,如同身份一样开始)?为什么我们需要序列?
我使用了以下脚本,
--Create the Test schema
CREATE SCHEMA Test ;
GO
-- Create a table
CREATE TABLE Test.Orders
(OrderID int PRIMARY KEY,
Name varchar(20) NOT NULL,
Qty int NOT NULL);
GO
-- Create a sequence
CREATE SEQUENCE Test.TestSequence
START WITH 1
INCREMENT BY 1 ;
GO
-- Insert three records
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.TestSequence, 'One', 2) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.TestSequence, 'Two', 1) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.TestSequence, 'Three', 1) ;
GO
-- View the table
SELECT * FROM Test.Orders ;
GO
CREATE TABLE Test.Employee
(EmpId int PRIMARY KEY,
EmpName varchar(20) NOT NULL,
DeptId int NOT NULL,
Sal Decimal(15,2));
GO
insert into Test.Employee (EmpId,EmpName,DeptId,Sal) values
(NEXT VALUE FOR Test.TestSequence,'One',1,45000),
(NEXT VALUE FOR Test.TestSequence,'Two',2,54000),
(NEXT VALUE FOR Test.TestSequence,'Three',3,60000),
(NEXT VALUE FOR Test.TestSequence,'Four',2,75000)
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.TestSequence, 'Four', 5) ;
insert into Test.Employee (EmpId,EmpName,DeptId,Sal) values
(NEXT VALUE FOR Test.TestSequence,'Five',1,90000)
select * from Test.Orders
select * from Test.Employee
O / P: -
OrderID, Name, Qty
1 One 2
2 Two 1
3 Three 1
8 Four 5
EmpId EmpName DeptId Sal
4 One 1 45000.00
5 Two 2 54000.00
6 Three 3 60000.00
7 Four 2 75000.00
9 Five 1 90000.00
期待结果: - OrderId = 1,2,3,4 ....
答案 0 :(得分:4)
使用Sequence
(identity column
不能)的优势是:
Sequence
未与任何表绑定,而在创建表时必须创建identity
。 Sequence
可以稍后添加到列中。
Sequence
支持Cyclying
功能,可以重复数字组。
Truncate
不会重置Sequence
号码。
您无法更新identity
列。 (直接更新身份值,而不是identity_insert
)
正如Alex
在评论中所说的那样,Sequence
可以在您需要密钥时不会在不同的表之间发生冲突时为您提供便利。
因此,对于任意数量的表格,您可以使用为Sequence
或MinValue 1
创建的相同Start with 1
。列。
请注意,当您使用Cyclying
时,最好将MinValue
设置为1而不是Start With
,否则,当Sequence
点击{{1}时如果你没有指定Max
,它将返回到Min
,默认为Min