外键约束的 ALTER TABLE 查询不起作用
ALTER TABLE query for foreign key constraint does not work
我是初学者,为了好玩而创建自己的简单区块链应用程序。区块链本身功能齐全。现在我正在尝试实现一个数据库来存储区块链的数据(现在我正在将其写入 .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 Wallet ADD CONSTRAINT fk_Wallet_public_key FOREIGN KEY(public_key) REFERENCES Peer_nodes (public_key)
ERROR:
如您所见,它没有真正的错误消息。在互联网上搜索了很多之后,我还没有发现查询本身可能存在的错误。我究竟做错了什么?我尝试通过 phpLitedmin 执行此操作,所以可能是问题所在?
您的外键引用指向了错误的列。它应该是主键,尽管它可以是唯一键。
如文档中所述:
Usually, the parent key of a foreign key constraint is the primary key
of the parent table. If they are not the primary key, then the parent
key columns must be collectively subject to a UNIQUE constraint or
have a UNIQUE index. If the parent key columns have a UNIQUE index,
then that index must use the collation sequences that are specified in
the CREATE TABLE statement for the parent table.
您应该修复 table 定义并添加外键以使用主键。
SQLite 的 ALTER TABLE 不支持添加约束。
您必须将约束包含在 CREATE TABLE 语句中。
正如 Gordon 已经指出的那样,外键约束 require the target to be a primary or candidate key。
我是初学者,为了好玩而创建自己的简单区块链应用程序。区块链本身功能齐全。现在我正在尝试实现一个数据库来存储区块链的数据(现在我正在将其写入 .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 Wallet ADD CONSTRAINT fk_Wallet_public_key FOREIGN KEY(public_key) REFERENCES Peer_nodes (public_key)
ERROR:
如您所见,它没有真正的错误消息。在互联网上搜索了很多之后,我还没有发现查询本身可能存在的错误。我究竟做错了什么?我尝试通过 phpLitedmin 执行此操作,所以可能是问题所在?
您的外键引用指向了错误的列。它应该是主键,尽管它可以是唯一键。
如文档中所述:
Usually, the parent key of a foreign key constraint is the primary key of the parent table. If they are not the primary key, then the parent key columns must be collectively subject to a UNIQUE constraint or have a UNIQUE index. If the parent key columns have a UNIQUE index, then that index must use the collation sequences that are specified in the CREATE TABLE statement for the parent table.
您应该修复 table 定义并添加外键以使用主键。
SQLite 的 ALTER TABLE 不支持添加约束。
您必须将约束包含在 CREATE TABLE 语句中。
正如 Gordon 已经指出的那样,外键约束 require the target to be a primary or candidate key。