สวัสดีฉันต้องการลบข้อมูลทั้งหมดในตาราง postgresql ของฉัน แต่ไม่ใช่ตารางนั้นเอง ฉันจะทำสิ่งนี้ได้อย่างไร?
สวัสดีฉันต้องการลบข้อมูลทั้งหมดในตาราง postgresql ของฉัน แต่ไม่ใช่ตารางนั้นเอง ฉันจะทำสิ่งนี้ได้อย่างไร?
คำตอบ:
ใช้TRUNCATE TABLE
คำสั่ง
เนื้อหาของตารางในฐานข้อมูล 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 ทั้งหมด ฉันไปตามลิงก์และเอกสารไม่ได้กล่าวถึงส่วนขยายใด ๆ ลิงค์อาจไม่ถูกต้องหรือล้าสมัย?
สำหรับโต๊ะขนาดเล็กDELETE
มักจะเร็วกว่าและต้องการการล็อคที่ก้าวร้าวน้อยกว่า (สำหรับการโหลดพร้อมกันจำนวนมาก):
DELETE FROM tbl;
โดยไม่มีWHERE
เงื่อนไข.
สำหรับโต๊ะขนาดกลางขึ้นไปTRUNCATE tbl
ให้ใช้เช่น @Greg โพสต์