как конвертировать перечисление mysql в postgres - PullRequest
0 голосов
/ 19 марта 2019
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 ]

1 голос
/ 20 марта 2019

перечисления не очень хороший способ для моделирования. В 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 (но не зарезервированным). Но в целом было бы лучше избегать использования ключевых слов в качестве идентификаторов.

0 голосов
/ 19 марта 2019

Вы можете использовать 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
);
...