0

我正在经历我的第一个 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_employeetable_areastable_agency中,但我不会被迫同时保存所有数据,因此我可以创建一个员工,然后创建一个机构或地址。

在单个数据插入的情况下,我应该使用这样的东西还是应该直接使用表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?
4

2 回答 2

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(如果记录不存在)。确保您阅读了它,因为它通过唯一索引工作。

直流

于 2010-01-06T23:40:47.017 回答
0

为了将行相互链接,我创建了一个关系表 node_employees。我用它来将员工与区域或机构联系起来,那么我应该如何将数据与这个关系表联系起来呢?

这应该是两张表 - 一张用于将员工与机构相关联,另一张用于将员工与区域相关联。你没有提到任何与地区相关的机构,给人的印象是它们是相互独立的......

无论如何,node_employees.employee_id应该是 的外键EMPLOYEES.employee_id,以确保员工必须已经作为有效值存在于系统中。对于agency_idbetweennode_employeesagencies表也是如此。

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

于 2010-01-06T23:30:47.653 回答