如何将mysql枚举转换为postgres

时间:2019-03-19 18:04:36

标签: postgresql-9.3

CREATE TABLE employees (
 id int NOT NULL,
  firstname varchar(100) NOT NULL,
  lastname varchar(100) NOT NULL,
  username varchar(40) NOT NULL,
  password varchar(100) NOT NULL,
  phone varchar(100) NOT NULL,
  address text NOT NULL,
  type enum('admin','employee') NOT NULL DEFAULT 'employee'
);

2 个答案:

答案 0 :(得分:1)

枚举并不是建模的好方法。在Postgres中,存在更好的替代方案,例如检查约束或外键。

但是,如果您确实想对模型进行非规范化(枚举就是这样做的),则需要首先定义一个枚举类型:

CREATE TYPE emp_type AS ENUM ('admin','employee');

CREATE TABLE employees 
(
   id int NOT NULL,
   firstname varchar(100) NOT NULL,
   lastname varchar(100) NOT NULL,
   username varchar(40) NOT NULL,
   password varchar(100) NOT NULL,
   phone varchar(100) NOT NULL,
   address text NOT NULL,
   type emp_type NOT NULL DEFAULT 'employee'
);

另一种选择(占用更多空间,但更灵活)是使用检查约束(MySQL仍然不支持该检查约束,枚举是一种解决方法):

CREATE TABLE employees 
(
   id int NOT NULL,
   firstname varchar(100) NOT NULL,
   lastname varchar(100) NOT NULL,
   username varchar(40) NOT NULL,
   password varchar(100) NOT NULL,
   phone varchar(100) NOT NULL,
   address text NOT NULL,
   type text  NOT NULL DEFAULT  'employee',
   check (type in ('employee', 'admin'))
);

请注意,type是一个SQL关键字(但不是保留关键字)。但总的来说,最好避免使用关键字作为标识符。

答案 1 :(得分:0)

您可以使用DOMAIN CHECK

CREATE DOMAIN field AS TEXT
CHECK VALUE IN ('admin','employee');

Then you declare the table as:

CREATE TABLE employees (
    id int NOT NULL,
    firstname varchar(100) NOT NULL,
    lastname varchar(100) NOT NULL,
    username varchar(40) NOT NULL,
    password varchar(100) NOT NULL,
    phone varchar(100) NOT NULL,
    address text NOT NULL,
    jobType field
);