1

我正在尝试使用 SELECT 查询语句在具有两列的表中执行 INSERT 语句(item_id 不为空,价格可以为空)。item_id 不是自动增量的,我会从另一个表中进行选择查询。所以一个例子是:

INSERT INTO myTable 
SELECT ((SELECT id FROM myCatalogue where name="Item X"), "500");

通过仅执行 SELECT 语句,如果列表中不存在 Item X,则查询将返回:

| SELECT id FROM myCatalogue where name="Item X" | 500 |
| 空 | 500 |

但是,当整个 INSERT + SELECT 语句时,将以下内容插入到“myTable”中:

| item_id | 价格 |
| 0 | 500 |

我希望 MySQL 在“myCatalogue”中不存在项目时提示我一个错误,例如“无法在 item_id 列中插入值 NULL”,以便我可以返回“myCatalogue”以验证该项目是否存在。但是它会自动将值从 NULL 更改为 0 并成功插入。因此,我想问一下我需要如何修改语句以使其不会将 NULL 更改为 0?

这是我的表定义:

CREATE TABLE myTable 
( 
    item_id int(11) unsigned NOT NULL, 
    price float unsigned DEFAULT NULL, 
    PRIMARY KEY (item_id) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
4

2 回答 2

1

我是初学者,理论上它会起作用。对于mysql.

INSERT INTO myTable SELECT ((SELECT IFNULL(id,0) as id FROM myCatalogue where name="Item X"), "500");

为了MsSql

INSERT INTO myTable SELECT ((SELECT ISNULL(id,0) as id FROM myCatalogue where name="Item X"), "500");

希望这对您有所帮助。

于 2013-06-19T08:11:52.507 回答
0
INSERT INTO myTable 
SELECT id, "500"
FROM myCatalogue
WHERE name = "Item X"

更容易使用。您可以通过 确认插入是否成功last_insert_id()

您可以尝试:

INSERT INTO myTable 
SELECT id, "500"
FROM myCatalogue
WHERE name = "Item X"
UNION
SELECT NULL, "500"

显然,id需要NULL启用 和default,如果是 ,这可能会很困难PRIMARY。如果你有PRIMARYUNIQUE想要一个错误,你可以像这样运行:

INSERT INTO myTable 
(   SELECT id, "500"
    FROM myCatalogue
    WHERE name = "Item X")
    UNION
(   SELECT item_id, "500"
    FROM myTable)
    LIMIT 1

只要idPRIMARY,它就会错误地尝试将现有id的插入表中。

于 2013-06-19T08:01:22.963 回答