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

Kunci asing yang fleksibel

Salah satu cara untuk menyelesaikannya adalah dengan menambahkan tabel ke database Anda untuk bertindak seperti basis untuk tabel lain dan menghubungkannya dengan hubungan satu-ke-satu ke tabel lain, lalu menghubungkan tabel peristiwa ke tabel dasar ini.
Ini akan memungkinkan Anda untuk menjaga integritas data untuk setiap tabel.
Tabel dasar bisa sesederhana hanya satu kolom, atau dapat memiliki kolom yang sama dengan semua tabel lainnya, sehingga menerapkan semacam " warisan" dalam struktur data Anda.

Buat tabel dasar (dengan asumsi tidak ada kolom umum di antara tabel lain):

CREATE TABLE TblObjectBase 
(
    ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)

Kemudian, untuk tabel lain yang perlu direferensikan oleh ObjectId di Events tabel:

CREATE TABLE TblClients 
(
    Client_Id int PRIMARY KEY,
    Client_FirstName varchar(10),
    Client_LastName varchar(10),
    --  Other client related data
    CONSTRAINT FK_TblClients_TblObjectBase
               FOREIGN KEY(Client_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

CREATE TABLE TblInvoices
(
    Invoice_Id int PRIMARY KEY,
    -- other incoice related data
     CONSTRAINT FK_TblInvoices_TblObjectBase
               FOREIGN KEY(Invoice_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

Satu-satunya yang tersisa adalah memasukkan nilai baru ke TblObjectBase untuk setiap sisipan pada tabel Anda yang lain. Ini dapat dengan mudah dicapai dengan prosedur tersimpan atau sebagai pengganti pemicu penyisipan.
Prosedur penyisipan dapat terlihat seperti ini:

CREATE PROCEDURE Insert_TblClients
(
    @Client_FirstName varchar(10),
    @Client_LastName varchar(10),
    -- any other client related data you might have
)
AS
DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

-- Insert the data to the clients table:
INSERT INTO TblClients 
(Client_Id, Client_FirstName, Client_LastName.....) VALUES
(@ClientId, @Client_FirstName, @Client_LastName...)

Pemicu penyisipan akan terlihat seperti ini:

CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT 
AS
BEGIN

DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

INSERT INTO TblClients 
(Client_Id, Client_FirstName, Client_LastName.....) 
SELECT @ClientId, Client_FirstName, Client_LastName..... 
FROM inserted

END

Jika Anda memilih untuk menggunakan alih-alih menyisipkan, fakta bahwa nilai Identity berasal dari tabel lain harus transparan bagi klien (program vb.net Anda).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Simulasi CONNECT SEBELUMNYA dari Oracle di SQL Server

  2. PILIH kueri dengan kondisi CASE dan SUM()

  3. Ketahui hubungan antara semua tabel database di SQL Server

  4. Apa Batasan Unik di SQL Server - Tutorial SQL Server / TSQL Bagian 95

  5. T-SQL dan klausa WHERE LIKE %Parameter%