【问题标题】:Cannot insert the value NULL into column 'X', table 'DB139.dbo.Y'; column does not allow nulls. INSERT fails无法将值 NULL 插入列 \'X\',表 \'DB139.dbo.Y\';列不允许空值。插入失败
【发布时间】:2022-12-01 05:54:03
【问题描述】:

我在 SQL Server 上工作。

我创建了下表:

CREATE TABLE Payment(
    Cust_ID                 CHAR(4),
    Credit_Card_Number      CHAR(16),
    Payment_Number          INTEGER,
    Date                    DATE,
    Fee                     MONEY,
    PRIMARY KEY (Cust_ID, Credit_card_number, Payment_number))

ALTER TABLE Payment
    ADD CONSTRAINT FK_CustPays
        FOREIGN KEY (Cust_ID) 
        REFERENCES Customer(Cust_ID) ON DELETE CASCADE
; 

ALTER TABLE Payment
    ADD CONSTRAINT FK_CardPayment
        FOREIGN KEY (Credit_Card_Number) 
        REFERENCES Credit_card(Credit_card_number) ON DELETE CASCADE
;

您可能会说,这是一个弱实体。我怀疑这就是为什么我不能使用 INSERT INTO 语句向其中插入值的原因,如下所示:

Insert into Payment(Payment_number,Date,Fee) Values ('918702','2016-08-12',93);

我得到错误

无法将值 NULL 插入“Cust_ID”列、表“DB139.dbo.Payment”;列不允许空值。插入失败。

我已经以这种方式成功地将数据插入到我的所有其他表中。唯一受此影响的 2 个表是其他 2 个弱实体(表 Savings_account 和 Checking_account)。如您所知,我没有包含任何 NULL 值,所以我不确定这个错误是关于什么的。

以下是另外 2 个弱实体,供参考(在“账户”表之后):

CREATE TABLE  Account(  
   Account_number           CHAR(10),
   Balance                  MONEY,
   Name_of_bank             VARCHAR(50),
   Date_of_creation         DATE,
   PRIMARY KEY  (Account_number))

ALTER TABLE Account
    ADD Account_number CHAR(16)
    CONSTRAINT FK_AccountNumberDouble
        FOREIGN KEY (Credit_card_number) 
        REFERENCES Credit_card(Credit_card_number) ON DELETE CASCADE
;

ALTER TABLE Account
    ADD Cust_ID CHAR(4)
    CONSTRAINT FK_CustIDTriple
        FOREIGN KEY (Cust_ID) 
        REFERENCES Customer(Cust_ID) 
;    

CREATE TABLE Savings_account(
  Account_number      CHAR(10),
  Interest_rate       INTEGER,
  PRIMARY KEY  (Account_number))

ALTER TABLE Savings_account
    ADD CONSTRAINT FK_SavingsAccount
        FOREIGN KEY (Account_number) 
        REFERENCES Account(Account_number) 
;    

CREATE TABLE Checking_account(
  Account_number        CHAR(10),
  Overdraft_limit       MONEY,
  PRIMARY KEY  (Account_number))

ALTER TABLE Checking_account
    ADD CONSTRAINT FK_CheckingAccount
        FOREIGN KEY (Account_number) 
        REFERENCES Account(Account_number) 
;

任何帮助表示赞赏。

【问题讨论】:

  • 错误很简单。主键不能有空值。如果您向 Payments 中插入一条记录,它必须具有 cust_id、credit_card_number 和 payment_number - 这些字段是表的主键。
  • 我认为为您的表设置一个 int 身份 ID 会好得多。拥有像您这样的复合 id 会带来痛苦而收效甚微。拥有无意义的 ID 是常规的最佳做法。

标签: sql sql-server sql-insert


【解决方案1】:

你应该插入值客户编号因为它不是身份而且是主键..

或者您将 Cust_ID 更改为身份

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多