【问题标题】:ALTER TABLE query for foreign key constraint does not work外键约束的 ALTER TABLE 查询不起作用
【发布时间】:2018-12-16 06:15:17
【问题描述】:

我是一个初学者,我创建自己的简单区块链应用程序是为了好玩。区块链本身功能齐全。现在我正在尝试实现一个数据库来存储区块链的数据(现在我正在将它写入一个 .txt 文件)。所以我想在 sqlite 中创建以下数据库模式:

CREATE TABLE `Blockchain` 
(
    `previous_hash` string  NOT NULL ,
    `timestamp` float  NOT NULL ,
    `signature_of_transactions` string  NOT NULL ,
    `index` bigint  NOT NULL ,

    PRIMARY KEY (`previous_hash`)
);

CREATE TABLE `Wallet` 
(
    `public_key` string  NOT NULL ,

    PRIMARY KEY (`public_key`)
);

CREATE TABLE `Transactions` 
(
    `signature` string  NOT NULL ,
    `sender` string  NOT NULL ,
    `recipient` string  NOT NULL ,
    `amount` float  NOT NULL ,

    PRIMARY KEY (`signature`)
);

CREATE TABLE `Peer_nodes` 
(
    `id` string  NOT NULL ,
    `public_key` string  NOT NULL ,

    PRIMARY KEY (`id`)
);

ALTER TABLE `Wallet` 
    ADD CONSTRAINT `fk_Wallet_public_key` 
    FOREIGN KEY(`public_key`) REFERENCES `Peer_nodes` (`public_key`);

ALTER TABLE `Transactions` 
    ADD CONSTRAINT `fk_Transactions_signature` 
    FOREIGN KEY(`signature`) REFERENCES `Blockchain` (`signature_of_transactions`);

ALTER TABLE `Transactions` 
    ADD CONSTRAINT `fk_Transactions_sender` 
    FOREIGN KEY(`sender`) REFERENCES `Wallet` (`public_key`);

ALTER TABLE `Transactions` 
    ADD CONSTRAINT `fk_Transactions_recipient` 
    FOREIGN KEY(`recipient`) REFERENCES `Wallet` (`public_key`);

使用上面的脚本创建带有列等的表格可以正常工作。 ALTER TABLE 查询无法以某种方式工作。这是我收到的以下错误消息:

ALTER TABLE 钱包添加约束 fk_Wallet_public_key FOREIGN KEY(public_key) REFERENCES Peer_nodes (public_key)
错误:

如您所见,它没有真正的错误消息。在互联网上搜索了很多之后,我没有发现查询本身可能存在错误。我究竟做错了什么?我尝试通过 phpLitedmin 执行此操作,所以问题可能出在哪里?

【问题讨论】:

    标签: sql sqlite foreign-keys relational-database alter-table


    【解决方案1】:

    SQLite 的ALTER TABLE 不支持添加约束。

    您必须将约束包含在 CREATE TABLE 语句中。

    正如 Gordon 已经指出的,外键约束 require the target to be a primary or candidate key

    【讨论】:

    • 感谢 Gordon 回答的澄清,现在可以使用了!
    【解决方案2】:

    您的外键引用指向了错误的列。它应该是主键,尽管它可以是唯一键。

    如文档中所述:

    通常,外键约束的父键是主键 的父表。如果它们不是主键,则为父键 键列必须共同受 UNIQUE 约束或 有一个唯一的索引。如果父键列有唯一索引, 那么该索引必须使用在 父表的 CREATE TABLE 语句。

    您应该修复表定义并添加外键以使用主键。

    【讨论】:

    • 感谢 Gordon 的帮助,现在已修复!
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2017-06-24
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多