我是一个初学者,创建自己的简单区块链应用很有趣。区块链本身功能齐全。现在,我正在尝试实现一个数据库来存储区块链的数据(现在我正在将其写入.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做到这一点,所以问题可能在那儿吗?
答案 0 :(得分:0)
您的外键引用到错误的列。它应该是主键,尽管可以是唯一键。
如文档中所述:
通常,外键约束的父键是主键 父表的如果它们不是主键,则父键 键列必须共同受到UNIQUE约束,或者 有一个唯一索引。如果父键列具有UNIQUE索引, 那么该索引必须使用在中指定的排序规则序列 父表的CREATE TABLE语句。
您应该修复表定义并添加外键以使用主键。
答案 1 :(得分:0)
SQLite的ALTER TABLE不支持添加约束。
您必须将约束包括在CREATE TABLE语句中。
正如戈登已经指出的那样,外键约束require the target to be a primary or candidate key。