1. sql server 2008 請教怎樣生成序列號
你這是什麼資料庫? SQL Server 的話,你可以把CID設為自增加1,這樣就可以實現在插入的時候自動生成CID的值了; 如果是oracle,你可以在oracle資料庫里建個sequense,通過 select sequense.next() from al 得到自增的序列號;
2. sql中sequence的用法
insert into PRODUCT (你建的序列.NEXTVAL,PRD_DESCRIPTION) values (id,description)
在每次插入數據的時候,id都會按你建的序列的增量自動增加。
sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。
1、 create sequence
你首先要有create sequence或者create any sequence許可權,
create sequence emp_sequence
INCREMENT BY 1 -- 每次加幾個
START WITH 1 -- 從1開始計數
NOMAXVALUE -- 不設置最大值
NOCYCLE -- 一直累加,不循環
CACHE 10;
一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回sequence的當前值
NEXTVAL=增加sequence的值,然後返回sequence值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL
可以使用sequence的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語句
- INSERT語句的子查詢中
- NSERT語句的VALUES中
- UPDATE 的 SET中
可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empseq.currval FROM DUAL;
但是要注意的是:
- 第一次NEXTVAL返回的是初始值;隨後的NEXTVAL會自動增加你定義的INCREMENT BY值,
然後返回增加後的值。CURRVAL 總是返回當前sequence的值,但是在第一次NEXTVAL
初始化之後才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次sequence的值,
所以如果你在同一個語句裡面使用多個NEXTVAL,其值就是不一樣的。明白?
- 如果指定CACHE值,oracle就可以預先在內存裡面放置一些sequence,這樣存取的快
些。
cache裡面的取完後,oracle自動再取一組到cache。 使用cache或許會跳號, 比如
資料庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可
以在create sequence的時候用nocache防止這種情況。
2、 Alter sequence
你或者是該sequence的owner,或者有ALTER ANY sequence許可權才能改動sequence。 可
以alter除start值之外的所有sequence參數。如果想要改變start值,必須drop sequence
再re-create。例子:
ALTER sequence emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000後從頭開始
NOCACHE;
影響sequence的初始化參數:
sequence_CACHE_ENTRIES =
設置能同時被cache的sequence數目。
可以很簡單的Drop sequence
DROP sequence order_seq;
sequence的用法:
create seqence sequence_name
[start with n1] ----------------->n1到n5都是整數;start with 生成的第一個n1值
[increment by n2] -----------------> increment by n2 遞增量,可以為正整數或負整數,指明每一次增加多少
[maxvalue n3|no maxvalue]----------------->maxvalue最大值,no maxvalue用於指定序列沒有上限
[minvalue n4|no minvalue]----------------->minvalue 最小值,no minvalue,沒有指定最小下限
[cache n5|no cache] ----------------->cache 用高速緩存中可以預分配的序列號個數,默認是20。 如果緩存中的序列號沒有用完就關閉資料庫等其它原因.
使用 sequence
CURRVAL 和 NEXTVAL 能夠在以下情況使用:insert的values字句、select中的select列表、update中的set字句
CURRVAL 和 NEXTVAL 不能夠在以下情況使用:子查詢、視圖和實體化視圖的查詢、帶distinct的select語句、帶 group by和order by的select語句、帶union或intersect或minus的select語句、select中的where字句、create table與alter table中的default值、check約束條件。
刪除sequence
drop sequence seq_a;當刪除sequence後,對應它的同義詞會被保留,但是引用時會報錯。
oracle rac環境中的sequence
oracle為了在rac環境下為了sequence的一致性,使用了三種鎖:row cache lock、SQ鎖、SV鎖。
row cache lock的目的是在sequence指定nocache的情況下調用sequence.nextval過程中保證序列的順序性;
SQ鎖是應用於指定了cache+noorder的情況下調用sequence.nextval過程中。
SV 鎖(dfs lock handel) 是調用sequence.nextval期間擁有的鎖。前提是創建sequence時指定了cache 和order屬性 (cache+order)。order參數的目的是為了在RAC上節點之間生成sequence的順序得到保障。
創建sequence賦予的cache值較小時,有enq:sq-contention等待增加的趨勢。
cache的預設值是20.因此創建並發訪問多的sequence時,cacheh值應取大一些。否則會發生enq:sq-contention等待事件。
rac上創建sequence時,如果指定了cache大小而賦予noorder屬性,則各節點將會把不同范圍的sequence值cache到內 存上。若兩個節點之間都必須通過依次遞增方式使用sequence,必須賦予如下的order屬性(一般不需要這樣做)」sql> create sequence seq_b cache 100 order」。
如果是已賦予了cache+order屬性的sequence,oracle使用SV鎖進行同步。SV鎖爭用問題發生時的解決方法與sq鎖 的情況相同,就是將cache 值進行適當調整。
在RAC多節點環境下,Sequence的Cache屬性對性能的影響很大。應該盡量賦予cache+noorder屬性,並要給予足夠的 cache值。如果需要保障順序,必須賦予cache+order屬性。但這時為了保障順序,實例之間需要不斷的交換數據。因此性能稍差。
(2)sql序列如何產生值擴展閱讀:
seqence的作用:
sequence號是資料庫系統按照一定規則自增的數字序列,因為自增所以不會重復。目前就我所了解的sequence的作用主要有兩個方面。
一:作為代理主鍵,唯一識別;
二:用於記錄資料庫中最新動作的語句,只要語句有動作(insert/delete等),sequence號都會隨著更新,所以我們可以根據sequence號來select出更新的語句。
3. sql 語句中怎麼獲得插入數據時 自動生成的自增長列的值
通過 IDENTITY 來設置
參數有2個,一個是「初始值」 一個是「增量」。
默認情況下 INSERT 語句中,不能對 IDENTITY 的欄位進行賦值。
1> CREATE TABLE test_create_tab2 (
2> id INT IDENTITY(1, 1) PRIMARY KEY,
3> val VARCHAR(10)
4> );
5> go
1> INSERT INTO test_create_tab2(val) VALUES ('NO id');
2> go
(1 行受影響)
4. 請教:在SQLSERVER中如何使用序列
SQL Server沒有序列,對應的是標識列。
該種列具有以下三種特點:
1、列的數據類型為不帶小數的數值類型
2、在進行插入(Insert)操作時,該列的值是由系統按一定規律生成,不允許空值
3、列值不重復,具有標識表中每一行的作用,每個表只能有一個標識列。
標識列的創建與修改
標識列的創建與修改,通常在企業管理器和用Transact-SQL語句都可實現,使用企業管理管理器比較簡單,請參考SQL Server的聯機幫助,這
里只討論使用Transact-SQL的方法
1、創建表時指定標識列
標識列可用 IDENTITY 屬性建立,因此在SQL Server中,又稱標識列為具有IDENTITY屬性的列或IDENTITY列。
下面的例子創建一個包含名為ID,類型為int,種子為1,遞增量為1的標識列
CREATE TABLE T_test
(ID int IDENTITY(1,1),
Name varchar(50)
)
--插入數據
INSERT T_test(Name) VALUES('張三');
5. 求教sql server創建序列,生成流水號,急用 謝謝了
SEQ_HA_PERSON_INFO這個是什麼?
既然是流水號,為什麼又說由序列SEQ_HA_PERSON_INFO生成?
流水號不是一個個的增加上去的嗎?
真心不明白
不過實現的方法2種
1、觸發器在插入的時候生成
2、函數,插入前生成,或者插入時生成(直接在vaLues中寫上就好)
6. sql查詢並新增一列,按條件排序後給這一列賦值,並滿足條件按序列賦值
--1.建表
createtable表
(
datadate,
namevarchar(10)
)
--2.插入數據
insertinto表values('2010-1-1','老李')
insertinto表values('2011-1-1','小王')
insertinto表values('2011-1-1','老李')
insertinto表values('2012-1-1','小王')
insertinto表values('2012-1-1','老李')
insertinto表values('2012-1-1','張大')
insertinto表values('2013-1-1','小王')
insertinto表values('2013-1-1','老李')
insertinto表values('2013-1-1','張大')
insertinto表values('2014-1-1','小王')
insertinto表values('2014-1-1','老李')
insertinto表values('2014-1-1','張大')
insertinto表values('2015-1-1','小王')
insertinto表values('2015-1-1','老李')
insertinto表values('2015-1-1','張大')
--3.添加一列
altertable表addsint
--4如果只是查詢(按name分組,data降序產生序列號)
select*,Row_number()over()Asidfrom表
--5.1如果需要更新
WithT
As
(
select*,Row_number()over()Asidfrom表
)
UpdateTSetS=id
--5.2查詢更新後的結果
select*from表orderbyname,datadesc
7. sql取序列最大值
ORACLE/DB2訪問SEQUENCE如下
SELECT
SEQ_SENT_MESSAGE.CURRVAL
FROM
DUAL
SELECT
SEQ_SENT_MESSAGE.NEXTVAL
from
al
你的MYSQL多少版本的呀?我記得我讀書那陣子MYSQL貌似沒有序列的
建表的時候應該可以自定義一個自增長欄位的
create
table
tab
(id
int
not
null
primary
key
auto_increment)
8. sql資料庫怎麼強行給序列號num賦值
SET IDENTITY_INSERT 表名稱 ON
然後就可以給標識列插入數值了。
9. 如何將SQL表中一列數字遞增1,比如從20001開始有十行自動生成到20010
1、創建資料庫表例如:
create table xuesheng
(
id int not null primary key identity(20001,1),
name varchar(50) null
)
2、表已經創建用如下語句修改
alter table xuesheng alter column id identity(20001,1) primary key not null
3、如果你沒有這一列可以用下面添加一個欄位
alter table xuesheng add id int primary key identity(20001,1) not null
10. SQL2005 如何序列自增
你這樣的情況創建表時:用一個identity(1,1)來創建一個自增列就可以了
alter table 表名 add MANAGER_ID int identity(1,1)--這個是表已經創建好了,增加一個自增列,
但加的列會在最後的欄位
最好在創建表時用這個
create table biao
(MANAGER_ID int identity(1,1),
)
注意:插入數據時不要插入自增列.