列" id_bank_card"列的冲突NULL / NOT NULL声明表" bill"

时间:2016-04-26 10:19:09

标签: sql database postgresql

我有一个表BILL,它与另一个表BANK_CARD相关联,如下所示:

create table BILL (
    id_bill              BIGSERIAL          not null,
    id_bank_card         BIGSERIAL          null,
    id_registred_user    BIGSERIAL          not null,
    reference_number     INT4                 null,
    purchase_date        DATE                 null,
    bill_status          VARCHAR(50)          null,
    payment_method       VARCHAR(50)          null,
    constraint PK_BILL primary key (id_bill)
);

create table BANK_CARD (
    id_bank_card         BIGSERIAL          not null,
    id_registred_user    BIGSERIAL          not null,
    card_type            VARCHAR(50)          null,
    card_number          INT4                 null,
    expiring_date        DATE                 null,
    cipher               INT4                 null,
    constraint PK_BANK_CARD primary key (id_bank_card)
);

表BILL与表BANK_CARD有0..1关联,BANK_CARD与表BILL有1..n关联。

但是当我执行我的sql脚本时,我收到以下错误:

conflicting NULL/NOT NULL declarations for column "id_bank_card" of table "bill"

因为关系BILL和BANK_CARD是0..1,外键id_bank_card在表格中可以为空,所以我不明白为什么会出现这个错误。

请帮忙吗? 感谢。

2 个答案:

答案 0 :(得分:5)

您对主键和外键的数据类型定义感到困惑。 bigintNULL类型值的生成器。外键应该使用该数据类型。见下面的表格定义。此外,使用NULL子句是多余的,因为这是默认行为。主键不能是NOT NULL,因此create table bank_card ( id_bank_card bigserial, id_registred_user bigint references <user table>, card_type VARCHAR(50), card_number INT4, expiring_date DATE, cipher INT4, constraint PK_BANK_CARD primary key (id_bank_card) ); create table bill ( id_bill BIGSERIAL, id_bank_card bigint references bank_card, id_registred_user bigint references <user table>, reference_number INT4, purchase_date DATE, bill_status VARCHAR(50), payment_method VARCHAR(50), constraint pk_bill primary key (id_bill) ); 也是多余的。

LookUpEdit.Properties.AllowNullInput

答案 1 :(得分:0)

如果您使用的是 Java + PostgreSQL:

如果您不小心将空字符串插入语句中,则会发生这种情况。

String N = System.getProperty("line.seperator");

返回null,搞砸了我的sql语句。

修复:(选择一项)

String N = System.lineSeparator();
String N = "\n";

出现在我的代码中的确切字符串:


    String CT =(""
 //:+"---------10--------20--------30-------39
 //:+"0123456789012345678901234567890123456789
    +"CREATE TABLE t_1(             "+N//:0
    +"id SERIAL PRIMARY KEY         "+N//:30
    +"    ,c_1    INT               "+N//:60
    +"    ,c_2    VARCHAR  (255)    "+N//:90
    +"    ,c_3    CHARACTER( 8 )    "+N//:120
    +"    ,c_4    BOOLEAN           "+N//:150
    +"    ,c_5    BYTEA             "+N//:180
    +"    ,c_6    DATE              "+N//:210
    +");                            "  //:240
    );;

当N == null而不是“ \ n”时的确切错误消息:


org.postgresql.util.PSQLException: 
ERROR: conflicting NULL/NOT NULL declarations 
       for column "nullid" of table "t_1"

堆栈: Java + Heroku + Tomcat9 + PostGreSQL 9.5.13