PostgreSQL ลบเนื้อหาทั้งหมด


112

สวัสดีฉันต้องการลบข้อมูลทั้งหมดในตาราง postgresql ของฉัน แต่ไม่ใช่ตารางนั้นเอง ฉันจะทำสิ่งนี้ได้อย่างไร?


คำตอบ:



115

เนื้อหาของตารางในฐานข้อมูล PostgreSQL สามารถลบได้หลายวิธี

การลบเนื้อหาตารางโดยใช้ sql:

การลบเนื้อหาของตารางเดียว:

TRUNCATE table_name;
DELETE FROM table_name;

การลบเนื้อหาของตารางที่มีชื่อทั้งหมด:

TRUNCATE table_a, table_b, …, table_z;

การลบเนื้อหาของตารางที่มีชื่อและตารางที่อ้างอิงถึง (ฉันจะอธิบายรายละเอียดเพิ่มเติมในคำตอบนี้ในภายหลัง):

TRUNCATE table_a, table_b CASCADE;

การลบเนื้อหาตารางโดยใช้ pgAdmin:

การลบเนื้อหาของตารางเดียว:

Right click on the table -> Truncate

การลบเนื้อหาของตารางและตารางที่อ้างอิงถึง:

Right click on the table -> Truncate Cascaded

ความแตกต่างระหว่างลบและตัดทอน:

จากเอกสารประกอบ:

DELETE ลบแถวที่ตรงตามคำสั่ง WHERE จากตารางที่ระบุ หากไม่มีคำสั่ง WHERE เอฟเฟกต์คือการลบแถวทั้งหมดในตาราง http://www.postgresql.org/docs/9.3/static/sql-delete.html

TRUNCATE เป็นส่วนขยาย PostgreSQL ที่มีกลไกที่เร็วกว่าในการลบแถวทั้งหมดออกจากตาราง TRUNCATE ลบแถวทั้งหมดออกจากชุดตารางอย่างรวดเร็ว มีผลเช่นเดียวกับ DELETE ที่ไม่มีเงื่อนไขในแต่ละตาราง แต่เนื่องจากไม่ได้สแกนตารางจริงจึงเร็วกว่า นอกจากนี้ยังเรียกคืนพื้นที่ดิสก์ทันทีแทนที่จะต้องใช้การดำเนินการ VACUUM ในภายหลัง สิ่งนี้มีประโยชน์ที่สุดบนโต๊ะขนาดใหญ่ http://www.postgresql.org/docs/9.1/static/sql-truncate.html

การทำงานกับตารางที่อ้างอิงจากตารางอื่น:

เมื่อคุณมีฐานข้อมูลที่มีมากกว่าหนึ่งตารางตารางอาจมีความสัมพันธ์กัน ตามตัวอย่างมีสามตาราง:

create table customers (
customer_id int not null,
name varchar(20),
surname varchar(30),
constraint pk_customer primary key (customer_id)
);

create table orders (
order_id int not null,
number int not null,
customer_id int not null,
constraint pk_order primary key (order_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

create table loyalty_cards (
card_id int not null,
card_number varchar(10) not null,
customer_id int not null,
constraint pk_card primary key (card_id),
constraint fk_customer foreign key (customer_id) references customers(customer_id)
);

และข้อมูลที่เตรียมไว้สำหรับตารางเหล่านี้:

insert into customers values (1, 'John', 'Smith');

insert into orders values 
(10, 1000, 1),
(11, 1009, 1),
(12, 1010, 1);        

insert into loyalty_cards values (100, 'A123456789', 1);

ใบสั่งซื้อโต๊ะอ้างอิงถึงลูกค้าในตารางและบัตรสะสมคะแนนของตารางอ้างอิงถึงลูกค้าในตาราง เมื่อคุณพยายามตัด / ลบออกจากตารางที่อ้างอิงโดยตารางอื่น (ตารางอื่นมีข้อ จำกัด ของคีย์ต่างประเทศกับตารางที่มีชื่อ) คุณจะได้รับข้อผิดพลาด ในการลบเนื้อหาจากทั้งสามตารางคุณต้องตั้งชื่อตารางเหล่านี้ทั้งหมด (ลำดับไม่สำคัญ)

TRUNCATE customers, loyalty_cards, orders;

หรือเฉพาะตารางที่อ้างอิงด้วยคำสำคัญ CASCADE (คุณสามารถตั้งชื่อตารางได้มากกว่าหนึ่งตาราง)

TRUNCATE customers CASCADE;

เช่นเดียวกับ pgAdmin คลิกขวาที่โต๊ะลูกค้าแล้วเลือก Truncate Cascaded


TRUNCATEเป็นส่วนหนึ่งของ ANSI SQL และรองรับในDBMS ทั้งหมด ฉันไปตามลิงก์และเอกสารไม่ได้กล่าวถึงส่วนขยายใด ๆ ลิงค์อาจไม่ถูกต้องหรือล้าสมัย?
Manngo

อืมน่าสนใจ ยังสามารถดูข้อความที่อ้างถึงได้ที่นี่: postgresql.org/docs/9.0/static/sql-delete.htmlแต่คุณพูดถูก - ไม่อยู่ในเอกสารสำหรับ 9.1
vitfo

34

สำหรับโต๊ะขนาดเล็กDELETEมักจะเร็วกว่าและต้องการการล็อคที่ก้าวร้าวน้อยกว่า (สำหรับการโหลดพร้อมกันจำนวนมาก):

DELETE FROM tbl;

โดยไม่มีWHEREเงื่อนไข.

สำหรับโต๊ะขนาดกลางขึ้นไปTRUNCATE tblให้ใช้เช่น @Greg โพสต์


5
"เล็ก" "กลาง" และ "ใหญ่กว่า" คืออะไร (โดยการประมาณของคุณ)
Jackson

3
@Jackson: มันยากที่จะปักหมุดลงอย่างแน่นอนเพราะมันขึ้นอยู่กับตัวแปรมากเกินไป คุณสามารถเรียกใช้การทดสอบบางอย่างเพื่อค้นหาจุดที่น่าสนใจในระบบของคุณ
Erwin Brandstetter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.