gpt4 book ai didi

mysql - 为什么此存储过程给出的结果与手动执行其内容的结果不同?

转载 作者:行者123 更新时间:2023-11-29 06:13:56 26 4
gpt4 key购买 nike

这是一个简单的 MySQL 模式

CREATE TABLE Currency
(
id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY
,code CHAR(3) NOT NULL UNIQUE
,exponent TINYINT NOT NULL
,sign VARCHAR (5) NOT NULL DEFAULT '¤'
,ccx_enabled BOOLEAN NOT NULL DEFAULT FALSE
,is_fiat BOOLEAN NOT NULL
);

CREATE TABLE `SiteAccount`
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,currency SMALLINT NOT NULL
,iban VARCHAR (34) NULL DEFAULT NULL
,ethereum CHAR (40) NULL DEFAULT NULL
,crypto_user INT NULL DEFAULT NULL
,FOREIGN KEY (currency) REFERENCES Currency (id)
);

CREATE PROCEDURE SetUpUserEthereumAddress (id INT, addr TEXT)
INSERT INTO SiteAccount (currency, ethereum, crypto_user)
VALUES
(
(SELECT id FROM Currency WHERE code='ETH'),
addr,
id
);

如果我调用存储过程,它会创建一个包含错误货币的行。

INSERT INTO Currency (code, exponent, sign, is_fiat, ccx_enabled) VALUES
('GBP', 2, '£', 1, 1)
,('USD', 2, '$', 1, 1)
,('EUR', 2, '€', 1, 1)
,('ETH', 6, 'Ξ', 0, 1)
;

CALL SetUpUserEthereumAddress (1, '5bb0aa60d694714db16cbd3e3574c59d5ee4a95b');

select * from SiteAccount JOIN Currency on SiteAccount.currency=Currency.id;

creates a row使用货币 GBP 而不是 ETH。但是,如果我复制存储过程的主体并手动替换参数,我会得到正确的结果。

INSERT INTO SiteAccount (currency, ethereum, crypto_user)
VALUES
(
(SELECT id FROM Currency WHERE code='ETH'),
'----aa60d694714db16cbd3e3574c59d5ee4a95b',
2
);

select * from SiteAccount JOIN Currency on SiteAccount.currency=Currency.id;

这按预期创建了货币 ETH 的记录。

为什么存储过程会选择/插入错误的货币 ID?

最佳答案

当您在存储过程中时,SELECT id FROM Currency WHERE code='ETH' 中的非限定id 引用存储过程id 参数,但不是 Currency 表中的 id 列。要引用表列,您需要使用表名限定 id:SELECT Currency.id FROM Currency WHERE code='ETH'

关于mysql - 为什么此存储过程给出的结果与手动执行其内容的结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36912477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com