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

chuyển đổi kiểu dữ liệu SET của MySQL thành Postgres

Bạn có thể sử dụng một mảng cho cột và toán tử "được chứa bởi" cho ràng buộc KIỂM TRA:

create table pancakes (
    color varchar(10)[] not null,
    check (color <@ ARRAY['red', 'green', 'blue']::varchar[])
);

Và sau đó những điều như thế này xảy ra:

=> insert into pancakes values (ARRAY['red']);
INSERT 0 1
=> insert into pancakes values (ARRAY['red','green','blue']);
INSERT 0 1
=> insert into pancakes values (ARRAY['red','green','blue','black']);
ERROR:  new row for relation "pancakes" violates check constraint "pancakes_color_check"
=> select * from pancakes;
      color       
------------------
 {red}
 {red,green,blue}
(2 rows)

Điều này sẽ cho phép {red,red} trong cột mặc dù; nếu không cho phép {red,red} là quan trọng, sau đó bạn có thể thêm một hàm để kiểm tra các giá trị màu duy nhất trong mảng và điều chỉnh ràng buộc KIỂM TRA:

create function has_unique_colors(varchar[]) returns boolean as $$
    select (select count(distinct c) from unnest($1) as dt(c)) = array_length($1, 1);
$$ language sql;

create table pancakes (
    color varchar(10)[] not null,
    check (color <@ ARRAY['red', 'green', 'blue']::varchar[] and has_unique_colors(color))
);

Một tùy chọn khác sẽ là một đống bảng kết hợp với các giá trị vô hướng đơn giản trong các cột. Tuy nhiên, điều này có thể phức tạp nếu bạn có sáu trong số các cột này. Bạn cũng có thể sử dụng phiên bản của hàm Erwin nếu bạn cần lo lắng về NULL trong "bộ":

create function has_unique_colors(varchar[]) returns boolean as $$
    select not exists(select c from unnest($1) dt(c) group by 1 having count(*) > 1);
$$ language sql;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm với truy vấn SQL không có đích cho dữ liệu kết quả

  2. Cách xác định các vấn đề về hiệu suất PostgreSQL với các truy vấn chậm

  3. Sắp xếp các phần tử mảng

  4. Truy xuất giá trị đã biết cuối cùng cho mỗi cột của hàng

  5. Thêm 'nối tiếp' vào cột hiện có trong Postgres