【问题标题】:Postgresql: How to use ENUM datatype?Postgresql:如何使用 ENUM 数据类型?
【发布时间】:2016-07-20 07:09:54
【问题描述】:

我是 Postgresql 的新手,我正在尝试创建这个表,实际上只是遵循一个类似的 mysql 表。但是我不断收到 ENUM() 的此错误 下面是创建表结构的查询:

CREATE TABLE IF NOT EXISTS gkb_users (
id bigint NOT NULL,
userid character varying(50) NOT NULL DEFAULT '',
password character varying(50) NOT NULL DEFAULT '',
firstname text NOT NULL,
middlename text NOT NULL,
lastname text NOT NULL,
email character varying(100) NOT NULL DEFAULT '',
gender enum('Male','Female') NOT NULL,
dob date NOT NULL,
mobile character varying(10) NOT NULL DEFAULT '',
telephone character varying(15) NOT NULL DEFAULT '',
city character varying(50) NOT NULL DEFAULT '',
address text NOT NULL,
shippingaddress text NOT NULL,
PIN character varying(255) NOT NULL,
shipping_PIN character varying(255) NOT NULL,
area character varying(255) NOT NULL,
shipping_area character varying(255) NOT NULL,
previouscart text NOT NULL,
updatedon timestamp(0) NOT NULL,
is_deleted enum('0','1') NOT NULL
);

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 最好使用正确的检查约束,而不是枚举(您应该阅读有关如何实际使用枚举的手册,in the manual 您在哪里找到该语法?)
  • 如何在 phppgadmin 中设置?没有检查数据类型
  • 检查约束不是“数据类型”。这是一个约束。您在 CREATE TABLE 语句中或使用 ALTER TABLE 语句中的 add it 就像任何其他约束一样。您应该真正学习 Postgres 的 SQL statements,而不是依赖一些 GUI 界面来构建您的数据模型。
  • 类似 CREATE TYPE 的东西?
  • 所以在这种情况下,比如说is_deleted 会是is_deleted numeric CONSTRAINT deleted CHECK (0 || 1) ?

标签: postgresql


【解决方案1】:

ENUM 是用户定义的数据类型。您可以使用 CREATE TYPE 语法创建枚举,然后在架构中使用它来创建表。

CREATE TYPE your_enum2 AS ENUM('0','1');
CREATE TYPE your_enum1 AS ENUM('male','female');

后跟 CREATE TABLE 语句,

 CREATE TABLE IF NOT EXISTS gkb_users (
 id bigint NOT NULL,
 userid character varying(50) NOT NULL DEFAULT '',
 password character varying(50) NOT NULL DEFAULT '',
 firstname text NOT NULL,
 middlename text NOT NULL,
 lastname text NOT NULL,
 email character varying(100) NOT NULL DEFAULT '',
 gender your_enum1 NOT NULL,
 dob date NOT NULL,
 mobile character varying(10) NOT NULL DEFAULT '',
 telephone character varying(15) NOT NULL DEFAULT '',
 city character varying(50) NOT NULL DEFAULT '',
 address text NOT NULL,
 shippingaddress text NOT NULL,
 PIN character varying(255) NOT NULL,
 shipping_PIN character varying(255) NOT NULL,
 area character varying(255) NOT NULL,
 shipping_area character varying(255) NOT NULL,
 previouscart text NOT NULL,
 updatedon timestamp(0) NOT NULL,
 is_deleted your_enum2 NOT NULL
 );

有关枚举创建和使用的更多信息,请参阅 postgresql 文档https://www.postgresql.org/docs/current/static/datatype-enum.html

【讨论】:

  • 尝试通过 phppgadmin 插入表时出现错误。创建类型错误
【解决方案2】:

您不需要为此使用枚举(我个人认为永远不需要枚举 - 但这是题外话)。

您应该将其实现为检查约束:

CREATE TABLE IF NOT EXISTS gkb_users 
(
  id                bigint NOT NULL,
  userid            varchar(50) NOT NULL DEFAULT '',
  password          varchar(50) NOT NULL DEFAULT '',
  firstname         text NOT NULL,
  middlename        text NOT NULL,
  lastname          text NOT NULL,
  email             varchar(100) NOT NULL DEFAULT '',
  gender            text NOT NULL,
  dob               date NOT NULL,
  mobile            varchar(10) NOT NULL DEFAULT '',
  telephone         varchar(15) NOT NULL DEFAULT '',
  city              varchar(50) NOT NULL DEFAULT '',
  address           text NOT NULL,
  shippingaddress   text NOT NULL,
  pin               varchar(255) NOT NULL,
  shipping_pin      varchar(255) NOT NULL,
  area              varchar(255) NOT NULL,
  shipping_area     varchar(255) NOT NULL,
  previouscart      text NOT NULL,
  updatedon         timestamp(0) NOT NULL,
  is_deleted        integer NOT NULL,
  constraint check_gender check (gender in ('Male', 'Female')), 
  constraint check_deleted flag check (is_deleted in (0,1))
)

但是,is_delete 最好是正确的 boolean 列 - 那么您也不需要该列的检查约束。

Postgres - 与许多其他 DBMS 一样 - 在比较字符串时区分大小写。因此,使用上述约束,您将无法将'male' 存储到gender 列中。


不相关但是:如果您假设 varchar(255) 与例如相比具有一些神奇的性能优势varchar(300) 那你错了。 varchar 列的最大长度不会影响存储值时的性能或空间要求。

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2022-01-06
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多