Merhaba postgresql tablolarımdaki tüm verileri silmek istiyorum, ancak tablonun kendisini değil. Bunu nasıl yapabilirim?
Yanıtlar:
TRUNCATE TABLEKomutu kullanın .
PostgreSQL veritabanındaki tablo / tabloların içeriği birkaç yolla silinebilir.
SQL kullanarak tablo içeriğini silme:
Bir tablonun içeriğini silme:
TRUNCATE table_name;
DELETE FROM table_name;
Tüm adlandırılmış tabloların içeriğini silme:
TRUNCATE table_a, table_b, …, table_z;
Bunlara atıfta bulunan adlandırılmış tabloların ve tabloların içeriğini silme (Bu yanıtın ilerleyen kısımlarında daha ayrıntılı olarak açıklayacağım):
TRUNCATE table_a, table_b CASCADE;
PgAdmin kullanarak tablo içeriğini silme:
Bir tablonun içeriğini silme:
Right click on the table -> Truncate
Tablo ve ona referans veren tabloların içeriğini silme:
Right click on the table -> Truncate Cascaded
Silme ve kesme arasındaki fark:
Belgelerden:
DELETE, belirtilen tablodan WHERE yan tümcesini karşılayan satırları siler. WHERE yan tümcesi yoksa, sonuç tablodaki tüm satırları silmektir. http://www.postgresql.org/docs/9.3/static/sql-delete.html
TRUNCATE, bir tablodan tüm satırları kaldırmak için daha hızlı bir mekanizma sağlayan bir PostgreSQL uzantısıdır. TRUNCATE, bir tablo kümesindeki tüm satırları hızlı bir şekilde kaldırır. Her tablodaki niteliksiz bir DELETE ile aynı etkiye sahiptir, ancak tabloları gerçekten taramadığı için daha hızlıdır. Ayrıca, sonraki bir VACUUM işlemi gerektirmek yerine disk alanını hemen geri kazanır. Bu, en çok büyük tablolarda kullanışlıdır. http://www.postgresql.org/docs/9.1/static/sql-truncate.html
Diğer tablodan referans alınan tabloyla çalışma:
Birden fazla tablo içeren bir veritabanınız olduğunda, tablolar muhtemelen ilişkiye sahiptir. Örnek olarak üç tablo var:
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)
);
Ve bu tablolar için hazırlanmış bazı veriler:
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);
Tablo siparişleri tablo müşterilerini ve tablo sadakat_kartları tablo müşterilerini referans alır. Diğer tablo / tablolar tarafından referans verilen tablodan TRUNCATE / DELETE yapmaya çalıştığınızda (diğer tablolar, adlandırılmış tabloya yabancı anahtar kısıtlamasına sahiptir) bir hata alırsınız. Her üç tablodan içerik silmek için tüm bu tabloları adlandırmanız gerekir (sıra önemli değildir)
TRUNCATE customers, loyalty_cards, orders;
veya sadece CASCADE anahtar kelimesiyle referans verilen tablo (birden fazla tabloyu adlandırabilirsiniz)
TRUNCATE customers CASCADE;
Aynısı pgAdmin için de geçerlidir. Müşteriler tablosuna sağ tıklayın ve Basamaklı Kes'i seçin.
TRUNCATEANSI SQL'in bir parçasıdır ve tüm DBMS'de desteklenir . Bağlantıyı takip ettim ve belge uzantılardan bahsetmiyor. Belki de bağlantı yanlış veya güncel değil?
İçin küçük tablolar DELETEdaha hızlı sık ve (ağır eşzamanlı yük için) daha az agresif kilitleme ihtiyacı:
DELETE FROM tbl;
Koşulsuz WHERE.
İçin orta veya büyük tablolar, ile gitmek TRUNCATE tbl@Greg yayınlanmıştır gibi.