我有一张叫table2的桌子,有3pk,categoryid,languageid&unitid。我试着从表1到表2做一个FK。但由于下一个错误,我无法添加FK约束:
database - PostgreSQL:PgAdmin上具有3个主键的表的外键-LMLPHP
关于英语:“ERROR没有与units表中的列一致的唯一限制”
表2:
database - PostgreSQL:PgAdmin上具有3个主键的表的外键-LMLPHP
表1:

database - PostgreSQL:PgAdmin上具有3个主键的表的外键-LMLPHP
限制条件:
database - PostgreSQL:PgAdmin上具有3个主键的表的外键-LMLPHP
关于PSQL
表2(单位)

                              Tabla ½public.units╗
       Columna       |       Tipo       | Ordenamiento | Nulable  | Por omisi¾n
---------------------+------------------+--------------+----------+-------------
 unitdisplayname     | text             |              |          |
 unitdescription     | text             |              |          |
 unitid              | integer          |              | not null |
 conversionfactor    | double precision |              |          |
 typesystem          | text             |              |          |
 prefixfactor        | integer          |              |          |
 categorydisplayname | text             |              |          |
 categoryid          | integer          |              | not null |
 languageid          | text             |              | not null |
═ndices:
    "units_pkey" PRIMARY KEY, btree (unitid, categoryid, languageid)

我正在尝试的SQL语句:
CREATE TABLE public.units_sensores
(
    id_rel integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 ),
    obra integer NOT NULL,
    edificio_serverguid integer NOT NULL,
    categoryid integer NOT NULL,
    unitid integer NOT NULL,
    PRIMARY KEY (id_rel),
    CONSTRAINT obras FOREIGN KEY (obra)
        REFERENCES public.obras (id_obra) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT edificios_serverguid FOREIGN KEY (edificio_serverguid)
        REFERENCES public.edificios_trend_meta (id_edificio) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT categoryid FOREIGN KEY (categoryid)
        REFERENCES public.units (categoryid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT unitid FOREIGN KEY (unitid)
        REFERENCES public.units (unitid) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
);

ALTER TABLE public.units_sensores
    OWNER to postgres;

总结:
我想知道如何将此写入postgreSQL:
reate Table A (
    A_ID char(3) primary key,
    A_name char(10) primary key,
    A_desc desc char(50)
)

create Table B (
    B_ID char(3) primary key,
    B_A_ID char(3),
    B_A_Name char(10),
    constraint [Fk_B_01] foreign key (B_A_ID,B_A_Name) references A(A_ID,A_Name)
)

最佳答案

不能创建外键约束,因为units(category_id)上没有唯一约束。
对于外键,需要在目标列上定义一个PRIMARY KEYUNIQUE约束。此约束标识目标行。
包含其他列的唯一约束不够好,因为目标表中仍可能有多行具有相同的category_id
由于表只能有一个主键约束,因此必须使用UNIQUE约束。要获得与主键相同的效果,该列也应该NOT NULL(表中已经是这种情况)。
例子:

ALTER TABLE units
   ADD UNIQUE (category_id);

添加这些约束可能会使主键多余。在这种情况下,可以删除它,并将其中一个新约束作为主键。

关于database - PostgreSQL:PgAdmin上具有3个主键的表的外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58836671/

10-16 03:50