如何将颜色和存储变体添加到数据库中已存在的产品?

Posted

技术标签:

【中文标题】如何将颜色和存储变体添加到数据库中已存在的产品?【英文标题】:How do I add a Colour and Storage Variant to a Product already present in the Database? 【发布时间】:2021-02-19 12:03:49 【问题描述】:

我有以下两个表:(C# 和 MS Access)

_sSqlString = "CREATE TABLE Device("
                                                + "deviceIdNo AUTOINCREMENT,"
                                                + "brandName VARCHAR,"
                                                + "modelName VARCHAR,"
                                                + "deviceCaliber VARCHAR,"
                                                + "batterySize INT,"
                                                + "screenSize DOUBLE,"
                                                + "frontCameraMP INT,"
                                                + "rearCameraMP INT,"
                                                + "PRIMARY KEY (deviceIdNo)"
                                                + ")";

 _sSqlString = "CREATE TABLE DeviceColourStorage("
                                                + "deviceIdNo AUTOINCREMENT,"
                                                + "storageCapacity VARCHAR,"
                                                + "colourVariant VARCHAR,"
                                                + "FOREIGN KEY(deviceIdNo) REFERENCES Device(deviceIdNo)"
                                                + ")";

目标:

允许用户将颜色和存储变体添加到数据库中已存在的设备。

我尝试过的:

成功:将 DeviceColourStorage 表中的 deviceIdNo 硬编码为 1。每当我添加新的存储容量或颜色变体时,它总是将其与 deviceIdNo 为 1 的设备链接。

不成功:使用 INSERT SELECT 命令根据 brandName 和 modelName 选择 deviceIdNo。在这个例子中,我硬编码了 Apple 和 iPhone 12 的值。

storageCapacity 和 colourVariant 是从用户输入值的另一段代码传入的变量。 (即 64 和红色)

string _sSqlString = "INSERT INTO DeviceColourStorage (deviceIdNo, storageCapacity, colourVariant)" + " Values((SELECT deviceIdNo FROM Device WHERE brandName = 'Apple', modelName='iPhone 12') , '" + storageCapacity + "', '" + colourVariant + "')";

这不会填充字段,表明某些描述有错误,但我不确定这可能是什么,或者是否有其他解决方法。

User Interface used by User

MS Access Database

提前感谢您的帮助。

【问题讨论】:

您不会在同一个 INSERT 语句中组合 VALUESSELECT。要么是INSERT INTO <table> VALUES (value, list, here); 要么是INSERT INTO <table> <select statement here>; 【参考方案1】:

您可以将查询编写为insert ... select 语句:

INSERT INTO DeviceColourStorage (deviceIdNo, storageCapacity, colourVariant)
SELECT deviceIdNo, @storageCapacity, @colourVariant 
FROM Device 
WHERE brandName = @brandName AND modelName= @modelName

@ 开头的变量代表查询的参数。

【讨论】:

非常感谢!这与 Alberts 的评论一起得到了排序!【参考方案2】:

您的子表创建搞砸了。

您的子表应该有一个 PK。 (不知道为什么没有????)。

此外,您将子表中的列设置为自动增量。这意味着数据库将推入一个递增的数字。但是您想将该值设置为外键键返回父表。

每张桌子:确保每张桌子都有一个 PK。

plane jane 标准长编号列始终用于关联到父表 - 它不能是自动编号,因为您的代码必须设置父表中的哪一行这属于两个。

你有这个:

首先你的子表没有 PK - bad bad!

上面的更糟糕的是无法工作。您在子表中的 FK 不能自动递增 - 因为它必须通过某种魔术知道它属于设备中的哪个父记录。作为一个自动增量,系统会选择这个值——而不是你!

你需要这个设置:

因此您的子表创建语句需要是这样的:

CREATE TABLE DeviceColourStorage
(
ID AUTOINCREMENT,
deviceIdNo LONG,
storageCapacity VARCHAR,colourVariant VARCHAR,
PRIMARY KEY (ID),
FOREIGN KEY(deviceIdNo) REFERENCES Device(deviceIdNo)
)

所以 FK 永远不是自动增量。您创建一个平面简长号字段。此字段是您的代码设置的字段,用于确定它属于哪个父记录。

所以你真的需要并且想要为每张桌子有一个 PK(糟糕的是你没有!)。 并且 FK 不能是某种自动增量,因为这意味着系统将为该列选择一些出乎意料的下一个数字,而不是您的代码必须在代码中设置正确的外键值 - 因此允许您设置/选择这个子行所属的记录。

【讨论】:

非常感谢!这与 GMB 的评论一起整理好了!

以上是关于如何将颜色和存储变体添加到数据库中已存在的产品?的主要内容,如果未能解决你的问题,请参考以下文章

如何将变体库存状态添加到 Woocommerce 产品变体下拉列表

如何将新列动态添加到 bigquery 中已存在的表..?

将高级自定义字段添加到 WooCommerce 产品变体

将产品/可下载选项添加到单个产品变体

将公共代码添加为 git 子模块的问题:“索引中已存在”

将图像批量导入 Firebase 存储并将下载链接添加到 Firebase 数据库节点