Articles Comments

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

Written by

บอกเล่าสิ่งที่พบเจอมาในการทำงาน ประสบการณ์การทำงานด้าน DBA ถ่ายทอดกันด้วยภาษาง่ายๆ บ้านๆ " ทุกอย่างไม่อยาก แต่... แค่ตั้งใจไม่พอ ต้องลงมือทำ และทำ GoodLuck " Fanpage: www.facebook.com/DBAor .. "Oracle Database Consultant " ..

Filed under: Database, DBA, Oracle, Oracle Tips · Tags: , , , , , , , , ,