给你一个参考的例子, 你参照着, 创建一个 外键约束就可以了。
首先是测试的表结构与测试数据, 和你的例子一样, 是3列。
分别为: id, 父id, 数据
CREATE TABLE test_self (id INT NOT NULL,
pid INT,
value VARCHAR(10),
PRIMARY KEY(id)
)
INSERT INTO test_self VALUES(1, NULL, '.NET')
INSERT INTO test_self VALUES(2, 1, 'C#')
INSERT INTO test_self VALUES(3, 1, 'J#')
INSERT INTO test_self VALUES(4, 1, 'ASP.NET')
INSERT INTO test_self VALUES(5, 1, 'VB.NET')
INSERT INTO test_self VALUES(6, NULL, 'J2EE')
INSERT INTO test_self VALUES(7, 6, 'EJB')
INSERT INTO test_self VALUES(8, 6, 'Servlet')
INSERT INTO test_self VALUES(9, 6, 'JSP')
INSERT INTO test_self VALUES(10, NULL, 'Database')
INSERT INTO test_self VALUES(11, 10, 'DB2')
INSERT INTO test_self VALUES(12, 10, 'MySQL')
INSERT INTO test_self VALUES(13, 10, 'Oracle')
INSERT INTO test_self VALUES(14, 10, 'SQL Server')
INSERT INTO test_self VALUES(15, 13, 'PL/SQL')
INSERT INTO test_self VALUES(16, 15, 'Function')
INSERT INTO test_self VALUES(17, 15, 'Procedure')
INSERT INTO test_self VALUES(18, 15, 'Package')
INSERT INTO test_self VALUES(19, 15, 'Cursor')
INSERT INTO test_self VALUES(20, 14, 'T-SQL')
下面是 创建 外键约束, 和 测试删除 父节点, 同时删除子节点的处理。
mysql> ALTER TABLE test_self
-> ADD CONSTRAINT fk_test_self
-> FOREIGN KEY (pid) REFERENCES test_self(id) ON DELETE CASCADE
Query OK, 20 rows affected (0.05 sec)
Records: 20 Duplicates: 0 Warnings: 0
-- 测试 级联删除 层次为 1层的. (预期结果是 id=1,2,3,4,5 的被删除. )
mysql> DELETE FROM test_self WHERE ID = 1
Query OK, 1 row affected (0.07 sec)
-- 数据核对.
mysql> select * from test_self
+----+------+------------+
| id | pid | value |
+----+------+------------+
| 6 | NULL | J2EE |
| 7 | 6 | EJB |
| 8 | 6 | Servlet |
| 9 | 6 | JSP |
| 10 | NULL | Database |
| 11 | 10 | DB2 |
| 12 | 10 | MySQL |
| 13 | 10 | Oracle |
| 14 | 10 | SQL Server |
| 15 | 13 | PL/SQL |
| 16 | 15 | Function |
| 17 | 15 | Procedure |
| 18 | 15 | Package |
| 19 | 15 | Cursor |
| 20 | 14 | T-SQL |
+----+------+------------+
15 rows in set (0.00 sec)
-- 测试 级联删除 层次为 多层的. (预期结果是 id=10 与 10以后 的被删除. )
mysql> DELETE FROM test_self WHERE ID = 10
Query OK, 1 row affected (0.01 sec)
mysql> select * from test_self
+----+------+---------+
| id | pid | value |
+----+------+---------+
| 6 | NULL | J2EE |
| 7 | 6 | EJB |
| 8 | 6 | Servlet |
| 9 | 6 | JSP |
+----+------+---------+
4 rows in set (0.00 sec)
来自MySQL的学习笔记,写的不对的地方大家多多指教哦
什么是外键?
假设有 2 个表,分别是表 A 和表 B,它们通过一个公共字段“id”发生关联关系,我们把这个关联关系叫做 R。如果“id”在表 A 中是主键,那么,表 A 就是这个关系 R 中的主表。相应的,表 B 就是这个关系中的从表,表 B 中的“id”,就是表 B 用来引用表 A 中数据的,叫外键。所以,外键就是从表中用来引用主表中数据的那个公共字段。
语法结构:
在创建表时添加外键约束:
在修改表时定义外键约束:
例子1:创建表时添加外键约束
首先创建主表:importhead
创建从表:test_mysql.importdetails
查询外键约束的相关信息:
查询结果为:
例子2:修改表时定义外键约束
修改表时定义从表test_mysql.importdetails的外键约束
删除外键约束使用DROP,语法结构为:
例子:删除从表test_mysql.importdetails的外键约束
在 MySQL 中,有 2 种类型的连接,分别是内连接(INNER JOIN)和外连接(OUTER JOIN)。
在 MySQL 里面,关键字 JOIN、INNER JOIN、CROSS JOIN 的含义是一样的,都表示内连接。我们可以通过 JOIN 把两个表关联起来,来查询两个表中的数据。
例子:有一张销售表,如下图:
有一张会员信息表,如下图:
通过内连接,查询会员的销售记录:
运行语句,结果如下:
根据上面的结果,其实可以得知:内连接查询到结果集为两个表的交集部分。
跟内连接只返回符合连接条件的记录不同的是,外连接还可以返回表中的所有记录,它包括两类,分别是左连接和右连接。
例子1:左外连接
如果需要查询所有销售记录,则可以使用左外连接
运行语句,结果为:
从上面的结果可以得知,LEFT JOIN左边的表会返回全部记录,而右边的表只返回符合连接条件的记录
例子2:右外连接:
运行语句,结果为:
从上面的结果可以得知,RIGHT JOIN右边的表会返回全部记录,而左边的表只返回符合连接条件的记录
方法和 *** 作步骤如下:
1、首先,创建一个测试表,如下图所示,然后进入下一步。
2、其次,插入测试数据,如下图所示,然后进入下一步。
3、接着,完成上述步骤后,查询表中的数据,“select t.* from test_tbl2 t ”,如下图所示,然后进入下一步。
4、最后,完成上述步骤后,编写sql,两个表通过pid与id关联, “select t1.*, t2.* from test_tbl1 t1 join test_tbl2 t2 on t1.p_id = t2.id”,如下图所示。这样,问题就解决了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)