Ana içeriğe geç
Modül 9 · Ders 3 ders 4Kurstaki 35/57~10 min
Modül dersleri (3/4)

Yapının değiştirilmesi: ALTER TABLE

Bir uygulamanın ihtiyaçları zamanla değişir ve veritabanının buna ayak uydurması gerekir. ALTER TABLE, mevcut tablo şemalarını, onları bırakmak zorunda kalmadan (içerideki verileri riske atmadan) değiştirmeye adanmış (son derece çok yönlü) komuttur.

Sütunları Değiştirme (ADD / DROP / ALTER)

Sütun eklemek dikkat gerektirir. Tablo zaten veri içeriyorsa, "NOT NULL" sütununun eklenmesi Postgres'te hataya yol açacaktır: eski satırlara ne eklemeli? Bir DEFAULT ilişkilendirmeniz gerekir.

SQL
-- Aggiungiamo una colonna
ALTER TABLE users ADD COLUMN age INTEGER; -- Ok, sarà NULL ovunque

-- Aggiungiamo NOT NULL, quindi diamogli un deafult
ALTER TABLE users ADD COLUMN active BOOLEAN NOT NULL DEFAULT true;

-- Cancellare una colonna (ATTENZIONE! i dati andranno persi)
ALTER TABLE users DROP COLUMN age;

Sadece ekleme veya çıkarma değil: çoğu zaman bir sütunun type değerini veya kısıtlamalarından birini yeniden yapılandırmanız gerekir:

SQL
-- Cambia il tipo di dato (postgreSQL farà un 'cast' dei dati esistenti se possibile)
ALTER TABLE users ALTER COLUMN username TYPE VARCHAR(100);

-- Aggiunge il vincolo NOT NULL
ALTER TABLE users ALTER COLUMN username SET NOT NULL;

-- Rimuove il vincolo NOT NULL (ritorna ad accettare null)
ALTER TABLE users ALTER COLUMN username DROP NOT NULL;

Çalışma zamanında Kısıtlamalar ekleme

Tıpkı CREATE TABLE ile olduğu gibi, üretim uygulamasında zaten kullanımda olan bir tabloya CONSTRAINT eklemek için ALTER TABLE kullanabiliriz.

SQL
-- Aggiungi un nuovo Foreign Key
ALTER TABLE orders
  ADD CONSTRAINT fk_order_status FOREIGN KEY (status_id) REFERENCES statuses(id);

-- Aggiungi un CHECK
ALTER TABLE products
  ADD CONSTRAINT price_positive CHECK (price > 0);

-- E per distruggerli?
ALTER TABLE products DROP CONSTRAINT price_positive;

Yeniden adlandırma

Hem sütunlar hem de tablolar yeniden adlandırılabilir:

SQL
ALTER TABLE users RENAME TO auth_users;
ALTER TABLE auth_users RENAME COLUMN username TO login_name;

Deneyin

Egzersiz#sql.m9.l3.e1
Denemeler: 0Yükleniyor…

'Ürünler' tablosunda şu anda bir 'ad' sütunu bulunmaktadır. 'Ad' sütununu 'başlık' olarak yeniden adlandırarak tabloyu değiştirin. SÜTUNU YENİDEN ADLANDIR işlemini kullanın.

Düzenleyici yükleniyor…
İpucu göster

Sözdizimi: ALTER TABLE ... SÜTUNUN YENİDEN ADLANDIRILMASI ... TO ...

3 denemeden sonra çözüm mevcut

Post prodüksiyonda Kısıtlamalar Ekleme

Egzersiz#sql.m9.l3.e2
Denemeler: 0Yükleniyor…

Fiyatın ('fiyat' sütunu) 0'dan büyük olmasını gerektiren bir CHECK kısıtlaması ("verifica_prezzo" adlı) ekleyerek 'ürünler' tablosunu değiştirin. Kısıtlama, orijinal sütunu bırakmadan eklenmelidir.

Düzenleyici yükleniyor…
İpucu göster

Söz dizimi: ALTER TABLE tablo ADD CONSTRAINT name CHECK (...)

3 denemeden sonra çözüm mevcut