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

Thêm một cột làm khóa ngoại thì cột LỖI được tham chiếu trong ràng buộc khóa ngoại không tồn tại

Để thêm một ràng buộc vào một cột Nó cần phải tồn tại trước tiên trong bảng , không có lệnh nào trong Postgresql mà bạn có thể sử dụng để thêm cột và thêm ràng buộc cùng một lúc. Nó phải là hai lệnh riêng biệt. Bạn có thể làm điều đó bằng cách sử dụng các lệnh sau:

Đầu tiên hãy làm như:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER;

Tôi sử dụng integer như loại ở đây nhưng nó phải là cùng loại của id cột của auth_user bảng.

Sau đó, bạn thêm ràng buộc

ALTER TABLE links_chatpicmessage 
   ADD CONSTRAINT fk_someName
   FOREIGN KEY (sender) 
   REFERENCES auth_user(column_referenced_name);

ADD CONSTRAINT fk_someName một phần của lệnh này là đặt tên ràng buộc của bạn, vì vậy nếu sau này bạn cần ghi lại nó bằng một số công cụ tạo mô hình của bạn, bạn sẽ có một ràng buộc được đặt tên thay vì một tên ngẫu nhiên.

Ngoài ra, nó phục vụ cho các mục đích của quản trị viên để A DBA biết rằng ràng buộc là từ bảng đó.

Thông thường, chúng tôi đặt tên nó với một số gợi ý về nguồn gốc của nó và nơi nó tham chiếu trong trường hợp của bạn, nó sẽ là fk_links_chatpicmessage_auth_user vì vậy bất kỳ ai nhìn thấy tên này sẽ biết chính xác ràng buộc này là gì mà không cần thực hiện truy vấn phức tạp trên INFORMATION_SCHEMA để tìm hiểu.

CHỈNH SỬA

Như đã đề cập trong câu trả lời của @ btubbs, bạn thực sự có thể thêm một cột với một ràng buộc trong một lệnh. Như vậy:

alter table links_chatpicmessage 
      add column sender integer, 
      add constraint fk_test 
      foreign key (sender) 
      references auth_user (id);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. danh sách Postgres loại ENUM

  2. Xoay vòng trên nhiều cột bằng cách sử dụng Tablefunc

  3. Truy cập các tệp XML bên ngoài dưới dạng các biến trong tập lệnh PSQL (lấy nguồn từ tập lệnh bash)

  4. Khóa cho CHỌN để một quy trình khác không lấy dữ liệu cũ

  5. 3 cách liệt kê tất cả các hàm trong PostgreSQL