【问题标题】:How can I divide a database table into two tables on the basis of columns in MySQL如何根据MySQL中的列将数据库表分为两个表
【发布时间】:2017-09-15 06:25:24
【问题描述】:

我有一个十列的表:

name, id, colg, schol, add, no, subject, marks, surname, lectures

我可以将此表拆分为两个单独的表而不会丢失任何数据吗?

表一:

name, id, colg, schol, add, no

表二:

subject, marks, surname, lectures

【问题讨论】:

  • 您为什么要这样做?如果要这样做,则需要两个表之间的链接,因此表 2 还需要一个 id 列,该列需要与表 1 的对应
  • 您应该解释为什么要这样做,以及您希望通过将其拆分为两个表来实现什么?另外,这些表是否应该相互关联?
  • 是的,您可以轻松做到这一点。通常,这称为分区。在您的特定情况下,它称为垂直分区。 @shaunhusain 的回答展示了这一点的基本机制。
  • 为什么您想这样做?也许您可能只需要在一小部分时间内将数据保存到第二个表中。当许多查询只需要第一个表中的信息时,垂直分区还可以从根本上加快搜索速度。

标签: mysql database database-design


【解决方案1】:

是的,您只需在表之间创建一对一的关系。您可以通过在每个表上创建一个唯一的主键来做到这一点,其中第二个表的主键也是第一个表的主键的外键。

表 #1

PK_ID      (primary key)
name
id
colg
schol
add
no

表 #2

PK_ID      (primary key, foreign key to Table #1)
subject
marks
surname
lectures

所以步骤很简单:

  1. 使用上述结构创建两个新表)
  2. 将现有表中的所有记录插入表 #1
  3. 将现有表中的所有记录插入表 #2,并在表 #1 上连接以获取外键

(请注意,您也可以使用现有表中的一列作为主键,例如 id,只要它是唯一的。)

【讨论】:

  • 这是真的,我相信 OP 可能正在寻找如何使用 SELECT 插入 INSERT INTO?
  • dbasename 我的问题是如何根据字段名称将 master 中的记录划分为两个表。在那之后我可以你主键和外键的概念。
  • yes shaunhusain ........我想问一下如何从主表的两个表中插入记录..
  • @shaunhusain 我明白了,但首先告诉我如何在子表中插入记录..
【解决方案2】:
CREATE TABLE old_table (name VARCHAR(255), id BIGINT, colg VARCHAR(255), schol VARCHAR(255), addit VARCHAR(255), no VARCHAR(255), subject VARCHAR(255), marks VARCHAR(255), surname VARCHAR(255), lectures VARCHAR(255));

INSERT INTO old_table VALUES("shaun", 1234, "DePaul University", "Computing and Digital Media", "something", "something", "some subject", "A", "Husain","no thank you");

mysql> SELECT * FROM old_table;
+-------+------+-------------------+-----------------------------+-----------+-----------+--------------+-------+---------+--------------+
| name  | id   | colg              | schol                       | addit     | no        | subject      | marks | surname | lectures     |
+-------+------+-------------------+-----------------------------+-----------+-----------+--------------+-------+---------+--------------+
| shaun | 1234 | DePaul University | Computing and Digital Media | something | something | some subject | A     | Husain  | no thank you |
+-------+------+-------------------+-----------------------------+-----------+-----------+--------------+-------+---------+--------------+
1 row in set (0.00 sec)

CREATE TABLE table1 (name VARCHAR(255), id BIGINT PRIMARY KEY, colg VARCHAR(255), schol VARCHAR(255), addit VARCHAR(255), no VARCHAR(255));
CREATE TABLE table2 (id BIGINT PRIMARY KEY, subject VARCHAR(255), marks VARCHAR(255), surname VARCHAR(255), lectures VARCHAR(255));

INSERT INTO table1 (name,id,colg,schol,addit,no) SELECT name,id,colg,schol,addit,no from old_table;
INSERT INTO table2 (id,subject,marks,surname,lectures) SELECT id,subject,marks,surname,lectures from old_table;

mysql> select * from table1;
+-------+------+-------------------+-----------------------------+-----------+-----------+
| name  | id   | colg              | schol                       | addit     | no        |
+-------+------+-------------------+-----------------------------+-----------+-----------+
| shaun | 1234 | DePaul University | Computing and Digital Media | something | something |
+-------+------+-------------------+-----------------------------+-----------+-----------+
1 row in set (0.00 sec)

mysql> select * from table2;
+------+--------------+-------+---------+--------------+
| id   | subject      | marks | surname | lectures     |
+------+--------------+-------+---------+--------------+
| 1234 | some subject | A     | Husain  | no thank you |
+------+--------------+-------+---------+--------------+
1 row in set (0.00 sec)

mysql> select * from table1 LEFT JOIN table2 on (table1.id=table2.id);
+-------+------+-------------------+-----------------------------+-----------+-----------+------+--------------+-------+---------+--------------+
| name  | id   | colg              | schol                       | addit     | no        | id   | subject      | marks | surname | lectures     |
+-------+------+-------------------+-----------------------------+-----------+-----------+------+--------------+-------+---------+--------------+
| shaun | 1234 | DePaul University | Computing and Digital Media | something | something | 1234 | some subject | A     | Husain  | no thank you |
+-------+------+-------------------+-----------------------------+-----------+-----------+------+--------------+-------+---------+--------------+
1 row in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多