创建Postgresql表时,为什么出现“多个默认值”错误?

时间:2020-03-04 21:21:19

标签: sql postgresql

我正在尝试使用此查询创建表:

CREATE TABLE "real_estate_static" (
    "uid" SERIAL NOT NULL DEFAULT NEXTVAL("real_estate_uid_seq") PRIMARY KEY,
    "source_id" JSON NOT NULL,
    "source_url" TEXT NOT NULL,
    "created_at" TIMESTAMP NULL DEFAULT NULL,
    "address" TEXT NOT NULL,
    "city" TEXT NOT NULL,
    "state" TEXT NOT NULL,
    "zip" INTEGER NULL DEFAULT NULL,
    "latitude" NUMERIC NULL DEFAULT NULL,
    "longitude" NUMERIC NULL DEFAULT NULL,
    "type" TEXT NOT NULL,
    "category" TEXT NOT NULL,
    "square_ft" NUMERIC NULL DEFAULT NULL,
    "acres" NUMERIC NULL DEFAULT NULL,
    "images" JSON NULL DEFAULT NULL
);

错误:

multiple default values specified for column "uid" of table "real_estate_static"

我认为这可能是由于参数NOT NULL引起的错误,但是删除它并没有改变任何内容。我在互联网上发现的大多数此类错误问题都是由Django或其他ORM引起的,但这不是我的情况,因此我无法解决此问题。

1 个答案:

答案 0 :(得分:3)

serial不是实类型,而是包含默认值的别名。

From the docs...

smallserial,serial和bigserial数据类型不是真实类型,而仅仅是创建唯一标识符列的符号方便(类似于某些其他数据库支持的AUTO_INCREMENT属性)。在当前的实现中,指定:

CREATE TABLE tablename (
    colname SERIAL
);

等同于指定:

CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

因此nextvalnot null都不需要。 serial为您做到了。

"uid" SERIAL PRIMARY KEY,