ALTER TABLE查询外键约束不起作用

时间:2018-07-08 09:40:25

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

我是一个初学者,创建自己的简单区块链应用很有趣。区块链本身功能齐全。现在,我正在尝试实现一个数据库来存储区块链的数据(现在我正在将其写入.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外键(public_key)参考Peer_nodes(public_key)
  错误:

如您所见,它没有真正的错误消息。在互联网上搜索了很多之后,我自己没有在查询中发现可能的错误。我究竟做错了什么?我尝试通过phpLitedmin做到这一点,所以问题可能在那儿吗?

2 个答案:

答案 0 :(得分:0)

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

如文档中所述:

  

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

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

答案 1 :(得分:0)

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

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

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