Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Một khóa ngoại linh hoạt

Một cách để giải quyết vấn đề này là thêm một bảng vào cơ sở dữ liệu của bạn để hoạt động như một cơ sở cho các bảng khác và kết nối nó với mối quan hệ 1-1 với các bảng khác, sau đó kết nối bảng sự kiện với bảng cơ sở này.
Điều này sẽ cho phép bạn giữ toàn vẹn dữ liệu cho từng bảng.
Bảng cơ sở có thể đơn giản chỉ là một cột hoặc có thể có các cột thay cho tất cả các bảng khác có điểm chung, do đó thực hiện kiểu " kế thừa "trong cấu trúc dữ liệu của bạn.

Tạo bảng cơ sở (giả sử không có cột chung giữa các bảng khác):

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

Sau đó, đối với bất kỳ bảng nào khác cần được tham chiếu bởi ObjectId trong Events bảng:

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)
)

Điều duy nhất còn lại là chèn một giá trị mới vào TblObjectBase cho bất kỳ lần chèn nào trên các bảng khác của bạn. Điều này có thể dễ dàng đạt được bằng các thủ tục được lưu trữ hoặc thay vì trình kích hoạt chèn.
Thủ tục chèn có thể trông giống như sau:

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...)

Một trình kích hoạt thay vì chèn sẽ trông giống như sau:

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

Nếu bạn chọn sử dụng thay vì chèn, thực tế là giá trị Danh tính đến từ một bảng khác phải minh bạch đối với khách hàng (chương trình vb.net của bạn).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Làm cách nào để lấy id của các giá trị mà tôi vừa CHÈN?

  2. Hướng dẫn cho người mới bắt đầu về bảng SQL

  3. Nhận nhiều giá trị trong con trỏ máy chủ SQL

  4. SQL Server Các hàng tối đa có thể được chèn trong một trạng thái chèn duy nhất

  5. SQL Server Thay đổi tên cơ sở dữ liệu