Oracle DBA & All IT » Database, DBA, Oracle, Oracle Tips » Sequences (Autonumber) on Oracle
Sequences (Autonumber) on Oracle
วันนี้จะมาแนะนำ sequence ให้รู้จักกัน ใน oracle เราสามารถที่จะทำ autonumber ได้โดยใช้ sequence โดย oracle จะทำการ generate ค่าออกมาให้เราเอง
และ sequence เรายังจะสามารถเอามาช่วย gen เป็น pk ให้เราได้อีกด้วย
The syntax for a sequence is:
CREATE SEQUENCE sequence_name
MINVALUE value
MAXVALUE value
START WITH value
INCREMENT BY value
CACHE value;
For example:
CREATE SEQUENCE supplier_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
ตัวอย่างด้านบนคือการสร้าง seq ชื่อ supplier_seq โดยเริ่มต้นค่าที่ 1 และเพิ่มค่าที่ละ 1 (ie: 2,3,4,..) และจะมีการดึงขึ้น cache ทีละ 20 ค่า ซึ่งจะช่วยในส่วนของ performance.
ถ้าเราไม่ใส่ ค่า MAXVALUE sequence ที่เราสร้างขึ้นจะ default เป็น:
MAXVALUE 999999999999999999999999999
ดังนั้น เราสามารถที่จะสร้าง sequence แบบง่ายๆ ด้วยคำสั่งด้านล่าง :
CREATE SEQUENCE supplier_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
มาถึง step นี้เราได้ทำการสร้าง sequence เสร็จเรียบร้อย สำหรับการเรียกใช้ เราจะเรียกโดยใช้คำสั่ง nextval.
For example:
supplier_seq.nextval
คำสั่งด้านบนจะทำการดึงค่าจาก supplier_seq. โดยเราสามารถนำ nextval มาใช้ใน SQL statement. ได้ตามตัวอย่างด้านล่าง
For example:
INSERT INTO suppliers
(supplier_id, supplier_name)
VALUES
(supplier_seq.nextval, 'Kraft Foods');
ตัวอย่างด้านบน จะทำการ insert new record ลงใน table suppliers
สำหรับ column supplier_id จะเก็บค่าที่เราดึงมากจาก sequence supplier_seq
และ column supplier_name จะเก็บเป็น Kraft Foods.
คำถามที่เจอบ่อย
Question: cache และ nocache ต่างกันอย่างไร?
For example, you could create a sequence with a cache of 20 as follows:
CREATE SEQUENCE supplier_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 20;
Or you could create the same sequence with the nocache option:
CREATE SEQUENCE supplier_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;
Answer: การกำหนด cache คือการนำค่า sequence จำนวน 20 ค่าไปไว้บน memory เมื่อมีการเรียกใช้ก็จะทำงานได้เร็วกว่าแบบ nocache
แต่อย่างไรก็ตามก็มีข้อเสียเหมือนกัน ถ้าระบบเกิด down ขึ้นมา sequence ที่อยู่บน memory จะหายไป ทำให้จะเกิด sequence ที่กระโดดไป ไม่ต่อเนื่อง เหมือนกับแบบ nocache
Note: เราสามารถกู้ sequcen ที่หายไปโดยการ ALTER SEQUENCE reset ค่า counter ไปยังค่าล่าสุดได้
Nocache คือจะไม่มีการนำ sequence ขึ้นไปบน memory การทำงานจะช้ากว่าแบบ cache แต่จะไม่มีปัญหาเรื่องของ sequence กระโดด.
Question: เราจะ set ค่า LASTVALUE ใน oracle sequenceได้อย่างไร?
Answer: เราสามารถเปลี่ยน LASTVALUE ได้โดยการใช้คำสั่ง ALTER SEQUENCE
For example, ถ้าค่า lastvalue คือ 100 และเราต้องการเปลี่ยนให้เป็น 225 เราสามารถทำได้ด้วยคำสั่งด้านล่าง.
alter sequence seq_name
increment by 124;select seq_name.nextval from dual;
alter sequence seq_name
increment by 1;
ตอนนี้ ค่า next value ของการก็จะกลายเป็น 225.เรียบร้อยแล้ว
ลองเอาไปประยุกต์ใช้ดูค่ะ แล้วจะรู้ว่า sequence ทำให้ชีวิตเราง่ายขึ้นได้อย่างไร ^^
.. Preview : 11912
Filed under: Database, DBA, Oracle, Oracle Tips · Tags: alter sequence, autonumber, cache, create sequence, increment, maxvalue, minvalue, oracle, oracle sequence, start with