假设我有三个表:
| column | data_type |
|--------|-------------|
| id | int(10) |
| code | int(5) |
| name | varchar(50) |
| column | data_type |
|--------|-------------|
| id | int(10) |
| code | int(5) |
| name | varchar(50) |
| column | data_type |
|---------------|-------------|
| id | int(10) |
| category_id | int(10) |
| deposit_id | int(10) |
| category_code | int(5) |
| deposit_code | int(5) |
| name | varchar(50) |
{parent}_id
列是外键约束。 {parent}_code
是常规列,应在父表记录中匹配。
因此,由于某些原因,我必须在code
表上插入相同的id
(指代父项items
)。实际上,在运行select
语句之前,我正在执行时运行一堆insert
语句(PHP应用程序)。像这样:
// Begin transaction...
$categoryCode = Category::selectCode($categoryId);
$depositCode = Deposit::selectCode($depositId);
try {
$item = Item::insert([
'category_id' => $categoryId,
'deposit_id' => $depositId,
'category_code' => $categoryCode,
'deposit_code' => $depositCode,
'name' => $name,
]);
} catch (Exception $e) {
// Rolling back...
}
// Commiting...
这会减慢该过程,并且不能确保基于code
列的完整性。
我是SQL的新手,但我认为一种更好的方法是在insert
语句中自动填充这些列。如何复制{parent}_code
子表上的items
列?
答案 0 :(得分:1)
基本上,您无需在项目表中使用{parent} _code。但有时候,这是必需的。 如果您确实需要这些,可以执行“插入选择”,而不是“插入values()” 奎里看起来像这样
INSERT INTO items (category_id, deposit_id, category_code, deposit_code, name)
SELECT c.category_id, d.deposit_id, c.category_code, d.category_code, {name_val}
FROM categories as c JOIN deposits as d
ON (c.category_id= {c_id} and d.deposit_id= {d_id})
这是特定ID值的简单交叉连接。 IO成本可能与单独的多个查询相同。但这减少了执行次数。它将减少总执行时间。
答案 1 :(得分:1)
项目表中不需要category_code
和deposit_code
。
因此您的示例代码变为
// Begin transaction...
//$categoryCode = Category::selectCode($categoryId);
//$depositCode = Deposit::selectCode($depositId);
try {
$item = Item::insert([
'category_id' => $categoryId,
'deposit_id' => $depositId,
'name' => $name,
]);
} catch (Exception $e) {
// Rolling back...
}
// Commiting...
当您想查看此项的category_code
和deposit_code
时,只需使用category_id
和deposit_id
联接表
SELECT i.name as item_name, c.category_code, d.deposit_code, ....
FROM item i
JOIN category c ON c.id = i.category_id
JOIN deposit d ON d.id = i.deposit_id
WHERE .......