PostgreSQL - ชนิดข้อมูล
ในบทนี้เราจะพูดถึงประเภทข้อมูลที่ใช้ใน PostgreSQL ในขณะที่สร้างตารางคุณต้องระบุชนิดข้อมูลสำหรับแต่ละคอลัมน์นั่นคือชนิดของข้อมูลที่คุณต้องการจัดเก็บในฟิลด์ตาราง
สิ่งนี้ทำให้เกิดประโยชน์หลายประการ -
Consistency - การดำเนินการกับคอลัมน์ที่มีข้อมูลประเภทเดียวกันให้ผลลัพธ์ที่สอดคล้องกันและโดยปกติจะเร็วที่สุด
Validation - การใช้ประเภทข้อมูลอย่างเหมาะสมหมายถึงการตรวจสอบความถูกต้องของข้อมูลและการปฏิเสธข้อมูลนอกขอบเขตของประเภทข้อมูล
Compactness - เนื่องจากคอลัมน์สามารถจัดเก็บค่าประเภทเดียวได้จึงถูกจัดเก็บอย่างกะทัดรัด
Performance- การใช้ประเภทข้อมูลอย่างเหมาะสมทำให้การจัดเก็บข้อมูลมีประสิทธิภาพสูงสุด ค่าที่จัดเก็บสามารถประมวลผลได้อย่างรวดเร็วซึ่งช่วยเพิ่มประสิทธิภาพ
PostgreSQL รองรับประเภทข้อมูลที่หลากหลาย นอกจากนี้ผู้ใช้สามารถสร้างประเภทข้อมูลที่กำหนดเองได้โดยใช้คำสั่งCREATE TYPE SQL ประเภทข้อมูลใน PostgreSQL มีหลายประเภท พวกเขาจะกล่าวถึงด้านล่าง
ประเภทตัวเลข
ประเภทตัวเลขประกอบด้วยจำนวนเต็มสองไบต์สี่ไบต์และแปดไบต์ตัวเลขทศนิยมสี่ไบต์และแปดไบต์และทศนิยมที่มีความแม่นยำที่เลือกได้ ตารางต่อไปนี้แสดงประเภทที่ใช้ได้
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย | พิสัย |
---|---|---|---|
Smallint | 2 ไบต์ | จำนวนเต็มช่วงเล็ก | -32768 ถึง +32767 |
จำนวนเต็ม | 4 ไบต์ | ทางเลือกทั่วไปสำหรับจำนวนเต็ม | -2147483648 ถึง +2147483647 |
bigint | 8 ไบต์ | จำนวนเต็มช่วงใหญ่ | -9223372036854775808 ถึง 9223372036854775807 |
ทศนิยม | ตัวแปร | ความแม่นยำที่ผู้ใช้ระบุแน่นอน | มากถึง 131072 หลักก่อนจุดทศนิยม มากถึง 16383 หลักหลังจุดทศนิยม |
ตัวเลข | ตัวแปร | ความแม่นยำที่ผู้ใช้ระบุแน่นอน | มากถึง 131072 หลักก่อนจุดทศนิยม มากถึง 16383 หลักหลังจุดทศนิยม |
จริง | 4 ไบต์ | ความแม่นยำตัวแปรไม่แน่นอน | ความแม่นยำของทศนิยม 6 หลัก |
ความแม่นยำสองเท่า | 8 ไบต์ | ความแม่นยำตัวแปรไม่แน่นอน | ความแม่นยำของทศนิยม 15 หลัก |
smallserial | 2 ไบต์ | จำนวนเต็มอัตโนมัติขนาดเล็ก | 1 ถึง 32767 |
อนุกรม | 4 ไบต์ | การสร้างจำนวนเต็มอัตโนมัติ | 1 ถึง 2147483647 |
bigserial | 8 ไบต์ | จำนวนเต็มอัตโนมัติขนาดใหญ่ | 1 ถึง 9223372036854775807 |
ประเภทการเงิน
เงินประเภทเก็บสกุลเงินที่มีความแม่นยำเศษส่วนคงที่ ค่าของประเภทข้อมูลตัวเลข int และ bigintสามารถโยนเป็นเงินได้ ไม่แนะนำให้ใช้ตัวเลขทศนิยมเพื่อจัดการกับเงินเนื่องจากอาจเกิดข้อผิดพลาดในการปัดเศษ
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย | พิสัย |
---|---|---|---|
เงิน | 8 ไบต์ | จำนวนเงิน | -92233720368547758.08 ถึง +92233720368547758.07 |
ประเภทตัวละคร
ตารางด้านล่างแสดงประเภทอักขระที่ใช้งานทั่วไปที่มีอยู่ใน PostgreSQL
ส. เลขที่ | ชื่อและคำอธิบาย |
---|---|
1 | character varying(n), varchar(n) ความยาวผันแปรพร้อมขีด จำกัด |
2 | character(n), char(n) ความยาวคงที่เบาะว่าง |
3 | text ความยาวไม่ จำกัด ตัวแปร |
ประเภทข้อมูลไบนารี
byteaชนิดข้อมูลช่วยให้การจัดเก็บข้อมูลของสตริงไบนารีดังแสดงในตารางด้านล่าง
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย |
---|---|---|
bytea | 1 หรือ 4 ไบต์บวกสตริงไบนารีจริง | สตริงไบนารีความยาวผันแปร |
ประเภทวันที่ / เวลา
PostgreSQL รองรับประเภทวันที่และเวลาของ SQL เต็มรูปแบบดังแสดงในตารางด้านล่าง วันที่จะนับตามปฏิทินเกรกอเรียน ที่นี่ทุกประเภทมีความละเอียดของ1 microsecond / 14 digits ยกเว้น date ชนิดซึ่งมีความละเอียดคือ day.
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย | มูลค่าต่ำ | มูลค่าสูง |
---|---|---|---|---|
การประทับเวลา [(p)] [ไม่มีเขตเวลา] | 8 ไบต์ | ทั้งวันที่และเวลา (ไม่มีเขตเวลา) | 4713 ปีก่อนคริสตกาล | ค.ศ. 294276 |
TIMESTAMPTZ | 8 ไบต์ | ทั้งวันที่และเวลาพร้อมเขตเวลา | 4713 ปีก่อนคริสตกาล | ค.ศ. 294276 |
วันที่ | 4 ไบต์ | วันที่ (ไม่มีช่วงเวลาของวัน) | 4713 ปีก่อนคริสตกาล | ค.ศ. 5874897 |
เวลา [(p)] [ไม่มีเขตเวลา] | 8 ไบต์ | ช่วงเวลาของวัน (ไม่มีวันที่) | 00:00:00 น | 24:00:00 น |
เวลา [(p)] พร้อมเขตเวลา | 12 ไบต์ | ช่วงเวลาของวันเท่านั้นพร้อมเขตเวลา | 00: 00: 00 + 1459 | 24: 00: 00-1459 |
ช่วงเวลา [ฟิลด์] [(p)] | 12 ไบต์ | ช่วงเวลา | -178000000 ปี | 178000000 ปี |
ประเภทบูลีน
PostgreSQL จัดเตรียม Boolean ประเภท SQL มาตรฐาน บูลีนชนิดข้อมูลสามารถมีรัฐจริง , เท็จและเป็นรัฐที่สามที่ไม่รู้จักซึ่งเป็นตัวแทนโดยค่า null SQL
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย |
---|---|---|
บูลีน | 1 ไบต์ | สถานะเป็นจริงหรือเท็จ |
ประเภทแจกแจง
ประเภท Enumerated (enum) คือชนิดข้อมูลที่ประกอบด้วยชุดค่าคงที่ตามลำดับ เทียบเท่ากับประเภท enum ที่รองรับในภาษาโปรแกรมหลายภาษา
ไม่เหมือนกับประเภทอื่น ๆ ประเภท Enumerated ต้องสร้างโดยใช้คำสั่ง CREATE TYPE ประเภทนี้ใช้เพื่อจัดเก็บชุดค่าคงที่ตามลำดับ ตัวอย่างเช่นทิศทางของเข็มทิศเช่นทิศตะวันตกเฉียงใต้ทิศตะวันออกและทิศตะวันตกหรือวันในสัปดาห์ดังที่แสดงด้านล่าง -
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
แจกแจงสร้างครั้งเดียวใช้ได้เหมือนชนิดอื่น ๆ
ประเภทเรขาคณิต
ชนิดข้อมูลทางเรขาคณิตแสดงถึงวัตถุเชิงพื้นที่สองมิติ ประเภทพื้นฐานที่สุดประเด็นเป็นพื้นฐานสำหรับประเภทอื่น ๆ ทั้งหมด
ชื่อ | ขนาดการจัดเก็บ | การเป็นตัวแทน | คำอธิบาย |
---|---|---|---|
จุด | 16 ไบต์ | ชี้ไปที่เครื่องบิน | (x, y) |
ไลน์ | 32 ไบต์ | เส้นไม่มีที่สิ้นสุด (ไม่ได้ใช้งานอย่างสมบูรณ์) | ((x1, y1), (x2, y2)) |
lseg | 32 ไบต์ | ส่วนของเส้นตรง จำกัด | ((x1, y1), (x2, y2)) |
กล่อง | 32 ไบต์ | กล่องสี่เหลี่ยม | ((x1, y1), (x2, y2)) |
เส้นทาง | 16 + 16n ไบต์ | เส้นทางปิด (คล้ายกับรูปหลายเหลี่ยม) | ((x1, y1), ... ) |
เส้นทาง | 16 + 16n ไบต์ | เปิดเส้นทาง | [(x1, y1), ... ] |
รูปหลายเหลี่ยม | 40 + 16 น | รูปหลายเหลี่ยม (คล้ายกับเส้นทางปิด) | ((x1, y1), ... ) |
วงกลม | 24 ไบต์ | วงกลม | <(x, y), r> (จุดศูนย์กลางและรัศมี) |
ประเภทที่อยู่เครือข่าย
PostgreSQL เสนอประเภทข้อมูลเพื่อจัดเก็บที่อยู่ IPv4, IPv6 และ MAC ควรใช้ประเภทเหล่านี้แทนประเภทข้อความธรรมดาในการจัดเก็บที่อยู่เครือข่ายเนื่องจากประเภทเหล่านี้มีการตรวจสอบข้อผิดพลาดในการป้อนข้อมูลและตัวดำเนินการและฟังก์ชันพิเศษ
ชื่อ | ขนาดการจัดเก็บ | คำอธิบาย |
---|---|---|
cidr | 7 หรือ 19 ไบต์ | เครือข่าย IPv4 และ IPv6 |
inet | 7 หรือ 19 ไบต์ | โฮสต์และเครือข่าย IPv4 และ IPv6 |
macaddr | 6 ไบต์ | ที่อยู่ MAC |
ประเภทสตริงบิต
ประเภทสตริงบิตใช้ในการจัดเก็บมาสก์บิต ซึ่งเป็น 0 หรือ 1 มีบิต SQL สองประเภท:bit(n) และ bit varying(n)โดยที่ n คือจำนวนเต็มบวก
ประเภทการค้นหาข้อความ
ประเภทนี้รองรับการค้นหาข้อความแบบเต็มซึ่งเป็นกิจกรรมของการค้นหาผ่านชุดเอกสารภาษาธรรมชาติเพื่อค้นหาเอกสารที่ตรงกับข้อความค้นหามากที่สุด มีข้อมูลสองประเภทสำหรับสิ่งนี้ -
ส. เลขที่ | ชื่อและคำอธิบาย |
---|---|
1 | tsvector นี่คือรายการเรียงลำดับของคำที่แตกต่างกันซึ่งได้รับการทำให้เป็นมาตรฐานเพื่อรวมรูปแบบต่างๆของคำเดียวกันซึ่งเรียกว่า |
2 | tsquery นี้จัดเก็บคำศัพท์ที่ต้องค้นหาและรวมคำศัพท์เหล่านี้ไว้เพื่อเคารพตัวดำเนินการบูลีน & (AND), | (หรือ) และ! (ไม่). วงเล็บสามารถใช้เพื่อบังคับใช้การจัดกลุ่มของตัวดำเนินการ |
ประเภท UUID
UUID (Universally Unique Identifiers) เขียนเป็นลำดับของเลขฐานสิบหกตัวพิมพ์เล็กในหลาย ๆ กลุ่มคั่นด้วยยัติภังค์โดยเฉพาะกลุ่มของตัวเลขแปดหลักตามด้วยสามกลุ่มสี่หลักตามด้วยกลุ่ม 12 หลักสำหรับ จำนวน 32 หลักแทน 128 บิต
ตัวอย่างของ UUID คือ - 550e8400-e29b-41d4-a716-446655440000
ประเภท XML
ชนิดข้อมูล XML สามารถใช้เพื่อจัดเก็บข้อมูล XML สำหรับการจัดเก็บข้อมูล XML ก่อนอื่นคุณต้องสร้างค่า XML โดยใช้ฟังก์ชัน xmlparse ดังนี้ -
XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
<topics>...</topics>
</tutorial>')
XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
ประเภท JSON
JSONชนิดข้อมูลสามารถนำมาใช้ในการจัดเก็บข้อมูล JSON (JavaScript Object สัญลักษณ์) ข้อมูลดังกล่าวสามารถจัดเก็บเป็นข้อความได้เช่นกัน แต่ชนิดข้อมูลjsonมีข้อดีในการตรวจสอบว่าค่าที่จัดเก็บแต่ละค่าเป็นค่า JSON ที่ถูกต้อง นอกจากนี้ยังมีฟังก์ชันการสนับสนุนที่เกี่ยวข้องซึ่งสามารถใช้โดยตรงเพื่อจัดการกับประเภทข้อมูล JSON ดังต่อไปนี้
ตัวอย่าง | ตัวอย่างผลลัพธ์ |
---|---|
array_to_json ('{{1,5}, {99,100}}' :: int []) | [[1,5], [99,100]] |
row_to_json (แถว (1, 'foo')) | {"f1": 1, "f2": "foo"} |
ประเภทอาร์เรย์
PostgreSQL เปิดโอกาสให้กำหนดคอลัมน์ของตารางเป็นอาร์เรย์หลายมิติที่มีความยาวตัวแปร สามารถสร้างอาร์เรย์ของชนิดฐานในตัวหรือชนิดของ enum หรือประเภทคอมโพสิตที่กำหนดเองได้
การประกาศอาร์เรย์
ประเภทอาร์เรย์สามารถประกาศเป็น
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer[],
scheme text[][]
);
หรือโดยใช้คำหลัก "ARRAY" เป็น
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer ARRAY[4],
scheme text[][]
);
การแทรกค่า
ค่าอาร์เรย์สามารถแทรกเป็นค่าคงที่ตามตัวอักษรโดยใส่ค่าองค์ประกอบไว้ในวงเล็บปีกกาและคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างแสดงด้านล่าง -
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
การเข้าถึงอาร์เรย์
ตัวอย่างสำหรับการเข้าถึง Arrays แสดงอยู่ด้านล่าง คำสั่งที่ระบุด้านล่างนี้จะเลือกบุคคลที่มีเงินออมในไตรมาสที่สองมากกว่าไตรมาสที่สี่
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
การปรับเปลี่ยนอาร์เรย์
ตัวอย่างการแก้ไขอาร์เรย์มีดังที่แสดงด้านล่าง
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';
หรือใช้ไวยากรณ์ของนิพจน์ ARRAY -
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';
กำลังค้นหาอาร์เรย์
ตัวอย่างการค้นหาอาร์เรย์มีดังที่แสดงด้านล่าง
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR
saving_per_quarter[2] = 10000 OR
saving_per_quarter[3] = 10000 OR
saving_per_quarter[4] = 10000;
หากทราบขนาดของอาร์เรย์สามารถใช้วิธีการค้นหาที่ระบุข้างต้นได้ อื่น ๆ ตัวอย่างต่อไปนี้แสดงวิธีการค้นหาเมื่อไม่ทราบขนาด
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
ประเภทคอมโพสิต
ประเภทนี้แสดงถึงรายชื่อเขตข้อมูลและชนิดข้อมูลกล่าวคือโครงสร้างของแถวหรือระเบียนของตาราง
การประกาศประเภทคอมโพสิต
ตัวอย่างต่อไปนี้แสดงวิธีการประกาศประเภทคอมโพสิต
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
ชนิดข้อมูลนี้สามารถใช้ในตารางสร้างดังต่อไปนี้ -
CREATE TABLE on_hand (
item inventory_item,
count integer
);
การป้อนค่าคอมโพสิต
ค่าคอมโพสิตสามารถแทรกเป็นค่าคงที่ตามตัวอักษรโดยใส่ค่าฟิลด์ไว้ในวงเล็บและคั่นด้วยเครื่องหมายจุลภาค ตัวอย่างแสดงด้านล่าง -
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
สิ่งนี้ถูกต้องสำหรับรายการสินค้าคงคลังที่กำหนดไว้ด้านบน คีย์เวิร์ด ROW เป็นทางเลือกได้จริงตราบเท่าที่คุณมีมากกว่าหนึ่งฟิลด์ในนิพจน์
การเข้าถึงประเภทคอมโพสิต
ในการเข้าถึงช่องของคอลัมน์ผสมให้ใช้จุดตามด้วยชื่อเขตข้อมูลเช่นเดียวกับการเลือกเขตข้อมูลจากชื่อตาราง ตัวอย่างเช่นในการเลือกเขตข้อมูลย่อยบางส่วนจากตารางตัวอย่างบนมือของเราแบบสอบถามจะเป็นดังที่แสดงด้านล่าง -
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
คุณยังสามารถใช้ชื่อตารางได้เช่นกัน (ตัวอย่างเช่นในการสืบค้นหลายรายการ) เช่นนี้ -
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
ประเภทช่วง
ประเภทช่วงแสดงถึงชนิดข้อมูลที่ใช้ช่วงข้อมูล ประเภทช่วงสามารถเป็นช่วงที่ไม่ต่อเนื่อง (เช่นค่าจำนวนเต็ม 1 ถึง 10 ทั้งหมด) หรือช่วงต่อเนื่อง (เช่นช่วงเวลาใด ๆ ระหว่าง 10.00 น. ถึง 11.00 น.)
ประเภทช่วงในตัวที่มีให้ใช้งาน ได้แก่ ช่วงต่อไปนี้ -
int4range - ช่วงของจำนวนเต็ม
int8range - ช่วงของ bigint
numrange - ช่วงของตัวเลข
tsrange - ช่วงของการประทับเวลาโดยไม่มีเขตเวลา
tstzrange - ช่วงของการประทับเวลากับเขตเวลา
daterange - ช่วงวันที่
คุณสามารถสร้างประเภทช่วงที่กำหนดเองเพื่อให้มีช่วงประเภทใหม่ ๆ เช่นช่วงที่อยู่ IP โดยใช้ประเภท inet เป็นฐานหรือช่วงลอยโดยใช้ประเภทข้อมูลลอยเป็นฐาน
ประเภทช่วงรองรับขอบเขตช่วงที่รวมและพิเศษโดยใช้อักขระ [] และ () ตามลำดับ ตัวอย่างเช่น "[4,9)" แทนจำนวนเต็มทั้งหมดที่เริ่มจากและรวม 4 ถึง แต่ไม่รวม 9
ประเภทตัวระบุวัตถุ
ตัวระบุออบเจ็กต์ (OID) ถูกใช้ภายในโดย PostgreSQL เป็นคีย์หลักสำหรับตารางระบบต่างๆ หากระบุด้วย OIDSหรือเปิดใช้งานตัวแปรคอนฟิกูเรชันdefault_with_oidsเฉพาะในกรณีเช่นนี้จะเพิ่ม OID ลงในตารางที่ผู้ใช้สร้างขึ้น ตารางต่อไปนี้แสดงนามแฝงหลายประเภท ชนิดนามแฝง OID ไม่มีการดำเนินการของตนเองยกเว้นรูทีนอินพุตและเอาต์พุตพิเศษ
ชื่อ | อ้างอิง | คำอธิบาย | ตัวอย่างค่า |
---|---|---|---|
oid | ใด ๆ | ตัวระบุวัตถุที่เป็นตัวเลข | 564182 |
regproc | pg_proc | ชื่อฟังก์ชัน | ผลรวม |
regprocedure | pg_proc | ฟังก์ชันที่มีประเภทอาร์กิวเมนต์ | ผลรวม (int4) |
regoper | pg_operator | ชื่อผู้ดำเนินการ | + |
ผู้ควบคุม | pg_operator | ตัวดำเนินการที่มีประเภทอาร์กิวเมนต์ | * (จำนวนเต็มจำนวนเต็ม) หรือ - (ไม่มีจำนวนเต็ม) |
regclass | pg_class | ชื่อความสัมพันธ์ | pg_type |
regtype | pg_type | ชื่อชนิดข้อมูล | จำนวนเต็ม |
regconfig | pg_ts_config | การกำหนดค่าการค้นหาข้อความ | ภาษาอังกฤษ |
regdictionary | pg_ts_dict | พจนานุกรมค้นหาข้อความ | เรียบง่าย |
ประเภทหลอก
ระบบชนิด PostgreSQL ประกอบด้วยรายการวัตถุประสงค์พิเศษจำนวนหนึ่งซึ่งเรียกรวมกันว่าประเภทหลอก ไม่สามารถใช้ประเภทหลอกเป็นชนิดข้อมูลคอลัมน์ แต่สามารถใช้เพื่อประกาศอาร์กิวเมนต์ของฟังก์ชันหรือประเภทผลลัพธ์ได้
ตารางด้านล่างแสดงรายการประเภทหลอกที่มีอยู่
ส. เลขที่ | ชื่อและคำอธิบาย |
---|---|
1 | any ระบุว่าฟังก์ชันยอมรับชนิดข้อมูลอินพุตใด ๆ |
2 | anyelement ระบุว่าฟังก์ชันยอมรับชนิดข้อมูลใด ๆ |
3 | anyarray ระบุว่าฟังก์ชันยอมรับชนิดข้อมูลอาร์เรย์ใด ๆ |
4 | anynonarray ระบุว่าฟังก์ชันยอมรับชนิดข้อมูลที่ไม่ใช่อาร์เรย์ |
5 | anyenum ระบุว่าฟังก์ชันยอมรับชนิดข้อมูล enum ใด ๆ |
6 | anyrange ระบุว่าฟังก์ชันยอมรับชนิดข้อมูลช่วงใด ๆ |
7 | cstring ระบุว่าฟังก์ชันยอมรับหรือส่งคืนสตริง C ที่สิ้นสุดด้วยค่า null |
8 | internal บ่งชี้ว่าฟังก์ชันยอมรับหรือส่งคืนชนิดข้อมูลภายในเซิร์ฟเวอร์ |
9 | language_handler ตัวจัดการการเรียกภาษาขั้นตอนถูกประกาศให้ส่งคืน language_handler |
10 | fdw_handler ตัวจัดการ Wrapper ข้อมูลแปลกปลอมถูกประกาศให้ส่งคืน fdw_handler |
11 | record ระบุฟังก์ชันที่ส่งคืนประเภทแถวที่ไม่ระบุ |
12 | trigger มีการประกาศฟังก์ชันทริกเกอร์เพื่อส่งคืนทริกเกอร์ |
13 | void ระบุว่าฟังก์ชันไม่ส่งคืนค่า |