INSERT在关系表上有哪些更好的方法?

时间:2010-01-06 23:09:21

标签: php mysql database relational insert-id

我正在体验我的第一个mysql INSERT 测试,我正在使用这些表:

table employees
-> employee_id
-> employee_name
-> employee_surname
-> employee_url

table areas
-> area_id
-> area_city
-> area_address
-> area_country

table agencies
-> agency_id
-> agency_name
-> agency_url

table node_employees
-> node_id
-> employee_id
-> area_id
-> agency_id

我会将数据存储在 table_employee table_areas table_agency 中,但我不会被迫同时保存所有数据,所以我可以创建一名员工,随后创建一个代理机构或地址。

在单数据插入的情况下,我应该使用这样的东西还是shoud我直接使用表 node_employees ,如果是,我该怎么办?

INSERT INTO employees (employee_name, employee_surname, employee_url)
VALUES ('Roger', 'Waters', 'http://pinkfloyd.com')

INSERT INTO agencies (agency_name, agency_url)
VALUES ('Google', 'http://google.com')

INSERT INTO areas (area_city, area_address, area_country)
VALUES ('Rome', 'Via Roma, 123', 'Italy')

要相互链接我创建的 node_employees ,一个关系表。 我用它来链接一个区域或代理商的员工,那么我应该怎么做才能将数据与这个关系表链接起来呢?

SELECT employee_id FROM employees WHERE employee_name = 'Roger'
SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id
$php_agency_id

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

我还有另一个疑问,如果我需要将员工与某个区域联系起来该怎么办?我使用不同的查询,所以查询每种可能性?

// so, not this
$php_employee_id = 12;
$php_agency_id = 7;
$php_area_id = null;
INSERT INTO node_employees (employee_id, agency_id, area_id)
VALUES ('$php_employee_id', '$php_agency_id', '$php_area_id') // will this remove the previous data with null in area_id?

2 个答案:

答案 0 :(得分:1)

我假设代理商和地区是一对多的关系。换句话说,每个员工都可以分配到多个代理商和地区。如果没有,那么我只需将agency_id和area_id字段添加到employees表中,甚至不创建node_employees表。

考虑到上述情况......

根据您提供的说明,代理机构和区域似乎是相对静态的。因此,应在输入员工数据之前设置它们。

然后在插入员工时使用mysql_insert_id()返回刚刚创建的记录的id。 (我假设employee_id是一个自动增量字段)

然后按照你说的那样做

SELECT agency_id FROM agencies WHERE agency_name = 'Google'

// I'll get their ids in php
$php_employee_id <== from mysql_insert_id() after inserting employee record
$php_agency_id <== from above agency Select

// and then
INSERT INTO node_employees (employee_id, agency_id)
VALUES ('$php_employee_id', '$php_agency_id')

用于您的上一次查询

INSERT语句添加一条新记录,它不会替换现有记录。如果现有记录具有唯一索引,例如'employee_id',则它将失败并显示错误。您需要使用UPDATE来执行该操作或使用REPLACE语句更新记录(如果存在)或INSERT(如果记录不存在)。请确保您阅读它,因为它通过唯一索引工作。

DC

答案 1 :(得分:0)

  

为了相互链接行,我创建了node_employees,一个关系表。我用它来链接一个区域或代理商的员工,那么我应该怎么做才能将数据与这个关系表链接起来呢?

这应该是两个表 - 一个用于将员工与代理商联系,另一个用于将员工与区域相关联。你没有提到任何与代理商相关的领域,给人的印象是他们彼此独立......

无论如何,node_employees.employee_id应该是EMPLOYEES.employee_id的外键,以确保员工必须已作为系统中的有效值存在。同样地,对于agency_idnode_employees表之间的agencies

由于这些关系,EMPLOYEESAGENCIES中的值必须存在于NODE_EMPLOYEES表中之前。这使得NODE_EMPLOYEES表与其他两个表处于“子”关系,因此您的三个INSERT语句必须在子项之前插入父项,并使用子项中父项的值。

相关问题