Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Menemukan Pengidentifikasi Unik yang Optimal dalam Tabel di SQL Server:sp_special_columns

Di SQL Server, Anda dapat menggunakan sp_special_columns prosedur tersimpan sistem untuk mengidentifikasi pengidentifikasi unik untuk tabel. Secara khusus, ini mengembalikan kumpulan kolom optimal yang secara unik mengidentifikasi baris dalam tabel. Itu juga mengembalikan kolom yang diperbarui secara otomatis ketika nilai apa pun di baris diperbarui oleh suatu transaksi.

sp_special_columns setara dengan SQLSpecialColumns di ODBC.

Jika tidak ada kolom yang dapat mengidentifikasi tabel secara unik, kumpulan hasil akan kosong.

Sintaks

Sintaksnya seperti ini:

sp_special_columns [ @table_name = ] 'table_name'     
     [ , [ @table_owner = ] 'table_owner' ]   
     [ , [ @qualifier = ] 'qualifier' ]   
     [ , [ @col_type = ] 'col_type' ]   
     [ , [ @scope = ] 'scope' ]  
     [ , [ @nullable = ] 'nullable' ]   
     [ , [ @ODBCVer = ] 'ODBCVer' ]   
[ ; ]

@table_name argumen diperlukan. Yang lainnya adalah opsional. Lihat dokumentasi Microsoft untuk penjelasan mendetail tentang setiap argumen.

Contoh 1 – Kolom Kunci Utama

Berikut adalah contoh dasar terhadap tabel dengan kolom kunci utama yang disebut PersonId :

EXEC sp_special_columns Person;

Itu juga dapat dijalankan seperti ini:

EXEC sp_special_columns @table_name = 'Person';

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Dalam hal ini, kolom kunci utama dikembalikan. Saya tahu ini adalah kolom kunci utama, karena saya membuat tabel dengan kode berikut:

CREATE TABLE Person (
  PersonId int primary key, 
  PersonName varchar(500)
  );

Jadi tampaknya prosedur tersimpan memang mengembalikan kolom optimal yang secara unik mengidentifikasi tabel ini.

Contoh 2 – Kolom UNIK

Tabel dalam contoh ini tidak memiliki kunci utama, tetapi memiliki UNIQUE kendala.

Berikut kode yang digunakan untuk membuat tabel:

CREATE TABLE Event (
  EventId int UNIQUE, 
  EventName varchar(500)
  );

Jadi sekarang mari kita jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns Event;

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Dalam hal ini, kolom dengan UNIQUE kendala dianggap sebagai pengidentifikasi unik yang optimal.

Namun, ini tidak berarti bahwa apa pun kolom dibatasi oleh UNIQUE batasan akan secara otomatis memenuhi syarat sebagai pengidentifikasi unik. Hasilnya dapat bergantung pada bagaimana nilai nol diperlakukan.

Contoh 3 – Argumen @nullable

Anda dapat menggunakan @nullable argumen untuk menentukan apakah kolom khusus dapat menerima nilai nol.

Di sini, saya menjalankan kode yang sama lagi, kecuali kali ini saya menggunakan @nullable = 'O' .

EXEC sp_special_columns 
  Event, 
  @nullable = 'O';

Hasil:

(0 rows affected)

Ini dia menggunakan @nullable = 'U'

EXEC sp_special_columns 
  Event, 
  @nullable = 'U';

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

O menentukan kolom khusus yang tidak mengizinkan nilai nol. U menentukan kolom yang sebagian dapat dibatalkan. U adalah nilai default.

Inilah yang terjadi jika saya membuat kolom sebagai NOT NULL :

DROP TABLE Event;

CREATE TABLE Event (
  EventId int NOT NULL UNIQUE, 
  EventName varchar(500)
  );

EXEC sp_special_columns 
  Event, 
  @nullable = 'U';

EXEC sp_special_columns 
  Event, 
  @nullable = 'O';

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
(1 row affected)
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
(1 row affected)

Kali ini keduanya O dan U menghasilkan hasil yang sama.

Jika Anda memiliki tabel dengan beberapa UNIQUE kolom kendala, dan beberapa mengizinkan nilai nol sementara yang lain tidak, argumen ini dapat berdampak pada mana yang dianggap sebagai pengidentifikasi unik yang optimal. Lihat Contoh 7 di bagian bawah artikel ini untuk contoh dari apa yang saya maksud.

Contoh 4 – Kolom IDENTITAS

Tabel dalam contoh ini tidak memiliki kunci utama atau UNIQUE kendala, tetapi memiliki IDENTITY kolom.

Berikut kode yang digunakan untuk membuat tabel:

CREATE TABLE Product (
  ProductId int IDENTITY, 
  ProductName varchar(500)
  );

Jadi sekarang mari kita jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns Product;

Hasil:

(0 rows affected)

Jadi sepertinya IDENTITY tidak cukup untuk mengidentifikasi tabel ini secara unik.

Contoh 5 – Kunci Utama Multikolom

Ini satu dengan kunci utama multikolom. Dalam hal ini dua kolom digunakan untuk kunci utama.

Berikut kode yang digunakan untuk membuat tabel:

CREATE TABLE PersonProduct (
  PersonId int, 
  ProductId int,
   CONSTRAINT PK_PersonProduct PRIMARY KEY (PersonId, ProductId)
  ); 

Jadi sekarang mari kita jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns PersonProduct;

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
| 1       | ProductId     | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Contoh 6 – Kunci Utama dan Batasan UNIK

Bagaimana jika ada kunci utama dan sebuah UNIQUE kendala dalam tabel yang sama?

Mari kita cari tahu:

CREATE TABLE PersonEvent (
  PersonEventId int UNIQUE,
  PersonId int, 
  EventId int,
   CONSTRAINT PK_PersonEvent PRIMARY KEY (PersonId, EventId)
  );

Jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns PersonEvent;

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Kunci utama menang.

Bagaimana jika kita mengganti kunci utama dan UNIQUE kolom kunci di sekitar?

Oke, mari kita buat seluruh tabel lain hanya untuk itu:

CREATE TABLE PersonEvent2 (
  PersonEventId int PRIMARY KEY,
  PersonId int UNIQUE, 
  EventId int UNIQUE
  ); 

Jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns PersonEvent2;

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | PersonEventId | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Jadi kunci utama menang lagi.

Contoh 7 – Banyak Kendala UNIK

Bagaimana jika setiap kolom memiliki UNIQUE kendala?

CREATE TABLE Event2 (
  EventId int UNIQUE, 
  EventName varchar(500) UNIQUE,
  StartDate date UNIQUE,
  EndDate date UNIQUE
  );

Jalankan sp_special_columns terhadap tabel itu:

EXEC sp_special_columns Event2;

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EndDate       | -9          | date        | 10          | 20       | NULL    | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Tapi mari kita lihat apa yang terjadi jika kita menyetel salah satu kolom tersebut ke NOT NULL , lalu gunakan @nullable = 'O' :

DROP TABLE Event2;

CREATE TABLE Event2 (
  EventId int NOT NULL UNIQUE, 
  EventName varchar(500) UNIQUE,
  StartDate date UNIQUE,
  EndDate date UNIQUE
  );

Jalankan sp_special_columns dengan @nullable = 'O' :

EXEC sp_special_columns 
  Event2,
  @nullable = 'O'; 

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Jadi kolom “not nullable” sekarang dipilih sebagai pengidentifikasi unik yang optimal.

Sekarang mari kita jalankan sp_special_columns dengan @nullable = 'U' :

EXEC sp_special_columns 
  Event2,
  @nullable = 'U';

Hasil:

+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
| SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
|---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
| 1       | EndDate       | -9          | date        | 10          | 20       | NULL    | 1               |
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+

Sekarang kembali ke kolom sebelumnya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Keamanan Ketat CLR di SQL Server 2017

  2. Apa itu Operator Logika di SQL Server - Tutorial SQL Server / TSQL Bagian 124

  3. Masalah Replikasi Transaksional SQL Server

  4. Ambil gambar dari database di asp.net

  5. Pisahkan rentang tanggal menjadi satu baris per bulan di server sql