Dalam SQL, ALTER TABLE
pernyataan memodifikasi definisi dari tabel yang ada.
Anda dapat menggunakan ALTER TABLE
untuk mengubah, menambah, atau menghapus kolom dan batasan.
Bergantung pada DBMS Anda, ALTER TABLE
pernyataan juga dapat digunakan untuk menetapkan ulang dan membangun kembali partisi, atau menonaktifkan dan mengaktifkan batasan dan pemicu.
Sintaks
ALTER TABLE
pernyataan umumnya seperti ini:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Dimana:
table_name
adalah nama tabel yang ingin Anda ubah.[alter_option [, alter_option] …]
adalah daftar perubahan spesifik yang ingin Anda buat (misalnyaADD
diikuti dengan nama kolom dan definisi, atauDROP COLUMN
diikuti dengan nama kolom, dll).[partition_options]
adalah daftar opsi opsional khusus untuk tabel yang dipartisi. Tidak semua DBMS mendukung tabel yang dipartisi. Jika milik Anda, opsi tersebut memungkinkan Anda untuk menambah, menghapus, membuang, mengimpor, menggabungkan, atau membagi partisi, atau untuk melakukan pemeliharaan partisi.
Sintaks lengkap untuk ALTER TABLE
bisa sangat kompleks dan bervariasi secara signifikan antara DBMS. Untuk apa pun yang tidak tercakup dalam artikel ini, lihat dokumentasi DBMS Anda.
Di bawah ini adalah contoh ALTER TABLE
yang paling umum operasi.
Tambahkan Kolom Baru
Untuk menambahkan kolom baru ke tabel, gunakan ADD
klausa, diikuti dengan nama kolom dan tipe data.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Ini menambahkan kolom baru bernama ProductDescription
ke Products
tabel.
Dalam contoh ini, kami membuat kolom menjadi varchar(500)
tetapi Anda akan menggunakan tipe data apa pun yang sesuai untuk kolom baru Anda.
Anda juga dapat memasukkan batasan dalam definisi kolom Anda, tetapi ini mungkin bergantung pada DBMS Anda, dan apakah tabel sudah berisi data atau belum (lihat diskusi di bawah tentang ini).
Ganti Nama Kolom
Sebagian besar RDBMS utama (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) memungkinkan Anda untuk mengganti nama kolom seperti ini:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Jika Anda menggunakan MySQL sebelum versi 8.0, atau MariaDB sebelum 10.5.2+, Anda harus menggunakan CHANGE COLUMN
sintaks sebagai gantinya, yang juga mengharuskan Anda untuk menentukan ulang tipe data. Seperti ini:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
Di SQL Server, Anda harus menggunakan sp_rename
prosedur tersimpan untuk mengganti nama kolom. Seperti ini:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Lepaskan Kolom
Untuk menjatuhkan kolom, gunakan DROP COLUMN
klausa, diikuti dengan nama kolom.
ALTER TABLE table_name
DROP COLUMN column_name;
Memodifikasi Definisi Kolom
Sintaks untuk memodifikasi definisi kolom yang ada sangat bervariasi antar DBMS. Itu juga tergantung pada modifikasi apa yang perlu Anda buat.
Untuk mempermudah, mari lakukan modifikasi sederhana pada kolom di SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
Dalam contoh ini, kami mengubah ProductDescription
kolom dari varchar(500)
ke varchar(1000)
.
Berikut ini adalah sintaks dasar yang diperlukan oleh setiap DBMS untuk melakukan perubahan yang sama atau serupa.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB, dan Oracle sebelum 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Di Oracle 10g dan yang lebih baru:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite tidak akan mengizinkan Anda mengubah kolom, selain mengganti namanya.
Sintaks sebenarnya untuk setiap DBMS biasanya jauh lebih kompleks dari ini, dan tergantung pada apa yang Anda coba lakukan. Namun, ini akan membantu Anda memulai dengan modifikasi kolom dasar.
Pembatasan &Pertimbangan
Anda biasanya harus menghindari membuat modifikasi pada tabel setelah berisi data. Dengan melakukan perubahan, Anda berisiko kehilangan data yang ada.
Karena itu, banyak DBMS sebenarnya mencegah Anda membuat perubahan tertentu setelah tabel berisi data. Misalnya, Anda mungkin menemukan bahwa Anda tidak dapat menambahkan NOT NULL
kendala ke kolom yang berisi data.
Beberapa DBMS memungkinkan Anda untuk melakukannya, selama Anda menggunakan DEFAULT
batasan (untuk memberikan nilai default untuk kolom yang tidak memiliki data yang secara eksplisit dimasukkan ke dalamnya), atau kolom Identitas/peningkatan otomatis, atau kolom stempel waktu, dll.
Beberapa DBMS tidak mengizinkan Anda untuk menjatuhkan atau mengubah kolom dalam tabel.
Juga, beberapa DBMS membatasi tipe data yang dapat ditambahkan.
Contoh – Menambahkan Batasan NOT NULL
Berikut ini contoh untuk membantu menunjukkan poin di atas.
Inilah yang terjadi ketika saya mencoba menambahkan kolom dengan NOT NULL
batasan di SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Hasil:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
Pada dasarnya, tabel sudah berisi data, dan SQL Server mengembalikan kesalahan yang memberi tahu saya bahwa saya hanya dapat menambahkan NOT NULL
kendala jika tabel memenuhi kriteria tertentu, dan belum memenuhi kriteria itu.
Dan ada alasan bagus untuk kriteria itu.
Sebuah NOT NULL
kendala memastikan bahwa tidak ada NULL
nilai di kolom di baris mana pun. Masalahnya, kita sudah memiliki data di tabel, dan jika kita menambahkan kolom baru, baris yang ada akan menjadi NULL
– yang akan langsung melanggar NOT NULL
kami paksaan. Jadi kita perlu menentukan data untuk masuk ke baris yang ada.
Untuk melakukan ini, kita dapat menambahkan DEFAULT
batasan atau serupa untuk memastikan bahwa setiap baris yang ada secara otomatis diisi dengan data di kolom ini.
Contoh:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Ini hanya menambahkan DEFAULT
kendala pada kolom. Batasan ini memastikan bahwa semua baris berisi nilai (dalam hal ini, nilainya adalah N/A
) jika mereka belum diberi nilai. Ini berarti NOT NULL
batasan tidak akan dilanggar, karena semua baris yang ada sekarang akan berisi nilai.
Jika kolom baru harus memiliki nilai yang unik dan meningkat, Anda dapat menjadikannya IDENTITY
kolom (atau AUTOINCREMENT
dalam SQLite dan DBMS lainnya).
Namun, jika tabel belum berisi data, Anda mungkin dapat menambahkan kolom tanpa harus melakukan langkah-langkah berikut.
Opsi Partisi
Artikel ini ditujukan untuk pemula, dan tabel yang dipartisi sedikit di luar bidang tutorial pemula.
Karena itu, saya akan segera membahas beberapa opsi partisi sehubungan dengan ALTER TABLE
pernyataan.
Jika DBMS Anda mendukung tabel yang dipartisi, DBMS Anda mungkin juga menyediakan opsi partisi dengan ALTER TABLE
pernyataan.
Misalnya, di MySQL Anda dapat melakukan hal berikut:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Ini mempartisi tabel menjadi 8 partisi, dengan HASH
, menggunakan ProductId
kolom sebagai kunci partisi.
PARTITION BY HASH
menggunakan sisa ekspresi (dalam hal ini ProductId
kolom) dibagi dengan jumlah partisi (yaitu modulus).
Anda juga dapat menggunakan partisi rentang. Berikut cara menambahkan partisi rentang ke tabel yang ada:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Contoh ini menyiratkan bahwa Products
tabel sudah memiliki 8 partisi rentang, dan kami menambahkan partisi lain yang disebut Partition9
.
Anda dapat menghapus partisi seperti ini:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Ingatlah bahwa contoh-contoh ini adalah untuk MySQL.
Saya juga telah menulis beberapa artikel tentang tabel yang dipartisi di SQL Server. Sehubungan dengan ALTER TABLE
pernyataan, berikut cara mengganti partisi dan berikut cara mengganti partisi (keduanya dilakukan dengan ALTER TABLE
).
Di SQL Server, beberapa opsi partisi perlu dilakukan dengan pernyataan lain. Misalnya penggabungan partisi dilakukan dengan ALTER PARTITION FUNCTION
pernyataan, dan pemisahan partisi dilakukan dengan ALTER PARTITION SCHEME
pernyataan.
Jika Anda ingin mempelajari lebih lanjut tentang tabel yang dipartisi di SQL Server, berikut cara membuat tabel yang dipartisi di SQL Server.
ALTER TABLE
di SQLite
Saya juga harus menyebutkan bahwa SQLite memiliki dukungan yang sangat terbatas dari ALTER TABLE
penyataan. Dalam SQLite, ALTER TABLE
pernyataan memungkinkan Anda untuk mengubah nama tabel, untuk mengubah nama kolom dalam tabel, atau untuk menambahkan kolom baru ke tabel yang sudah ada.
Setiap perubahan lain akan mengharuskan Anda untuk meninggalkan meja dan mulai lagi. Ini juga berlaku untuk menambahkan kunci asing.