当前位置: 首页 > 面试题库 >

Sqlite将具有唯一值的数据库合并到一个数据库中,从而保留前向键关系

司徒钱青
2023-03-14
问题内容

提供了两种解决方案(请参阅底部的链接),但是两种解决方案都无法满足我的要求:

1.数据库中的给定表(相同)结构如下:

DB1

水果

--------------
| id | name  |
--------------
| 1  | Apple |
| 2  | Lemon |
| 3  | Kiwi  |
| 4  | Banana|
--------------

Juice

----------------
| id | name    |
----------------
| 1  | Juice A |
| 2  | Juice B |
----------------

配方(连接表)

----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1  | 1        | 1        |
| 2  | 1        | 2        |
| 3  | 2        | 1        |
| 4  | 2        | 3        |
----------------------------

DB2

水果

---------------
| id | name   |
---------------
| 1  | Kiwi   |
| 2  | Lemon  |
| 3  | Apple  |
| 4  | Orange |
| 5  | Lime   |
---------------

果汁

----------------
| id | name    |
----------------
| 1  | Juice C |
| 2  | Juice D |
----------------

配方(连接表)

----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1  | 1        | 1        |
| 2  | 1        | 3        |
| 3  | 2        | 2        |
| 4  | 2        | 4        |
----------------------------

2.将它们转换为:

DB3

水果

|----------------|
| id | name      |
|----------------|
| 1  | Kiwi      |
| 2  | Lemon     |
| 3  | Apple     |
| 4  | Orange    |
| 5  | Lime      |
| 6  | Banana    |
------------------

果汁

|--------------|
| id | name    |
|--------------|
| 1  | Juice A |
| 2  | Juice B |
| 3  | Juice C |
| 4  | Juice D |
----------------

配方(连接表)

----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1  | 1        | 3        |
| 2  | 1        | 2        |
| 3  | 2        | 3        |
| 4  | 2        | 1        |
++++++++++++++++++++++++++++
| 5  | 3        | 1        |
| 6  | 3        | 3        |
| 7  | 4        | 2        |
| 8  | 4        | 4        |
----------------------------

请注意,即使水果ID有所更改,水果ID也会相应更改,从而保持关系。ID是主要整数自动递增密钥,并且Recipe包含两个foregin密钥(加上自己的主要整数自动递增密钥)。

3.只有两个建议的解决方案是:

一种)

$sqlite3 database1.db '.dump' >> tmp
$sqlite3 database2.db '.dump' >> tmp
$sqlite3 database3.db '.import tmp'
$ #sometimes sqlite3 database3.db < 'tmp' instead of last row

来自类似的问题,以及:

b)

$ sqlite3 newdb
attach 'b.db' as toMerge;   
BEGIN; 
insert into newdb select * from toMerge.sometable; 
COMMIT;

所以,问题是。 如何在Linux中合​​并sqlite DB,保持关系,但不保留标签/注释中的重复值?
我以为保持组织结构是将事物保留在数据库中的主要原因,但似乎我不明白,如果将两个篮子合并在一起,为什么还要在一个篮子中保留两个相同的水果。我的篮子里应该装满独特的水果和食谱,我想吃那只奇异果:)


问题答案:

PRAGMA foreign_keys = on;

ATTACH DATABASE 'db1.sqlite' AS db1;

ATTACH DATABASE 'db2.sqlite' AS db2;

BEGIN;

CREATE TABLE Fruit      (
                          id            INTEGER PRIMARY KEY NOT NULL,
                          name          TEXT    UNIQUE ON CONFLICT IGNORE
                          )
                          ;

CREATE TABLE Juice      (
                          id            INTEGER PRIMARY KEY NOT NULL,
                          name          TEXT    UNIQUE ON CONFLICT IGNORE
                        )
                        ;

CREATE TABLE Recipe     (
                          id            INTEGER PRIMARY KEY NOT NULL,
                          juice_id      INTEGER NOT NULL,
                          fruit_id      INTEGER NOT NULL,
                          FOREIGN KEY   ( juice_id ) REFERENCES Juice ( id )
                                        ON UPDATE CASCADE
                                        ON DELETE CASCADE,
                          FOREIGN KEY   ( fruit_id ) REFERENCES Fruit ( id )
                                        ON UPDATE CASCADE
                                        ON DELETE CASCADE
                        )
                        ;


INSERT INTO Fruit  ( id, name )               SELECT id, name FROM db1.Fruit;
INSERT INTO Juice  ( id, name )               SELECT id, name FROM db1.Juice;
INSERT INTO Recipe ( id, juice_id, fruit_id ) SELECT id, juice_id, fruit_id FROM db1.Recipe;

INSERT INTO Fruit ( name ) SELECT name FROM db2.Fruit;
INSERT INTO Juice ( name ) SELECT name FROM db2.Juice;

CREATE TEMPORARY TABLE Recipe_tmp AS
                                    SELECT Juice.name AS j_name, Fruit.name AS f_name
                                      FROM db2.Recipe, db2.Fruit, db2.Juice
                                        WHERE db2.Recipe.juice_id = db2.Juice.id AND db2.Recipe.fruit_id = db2.Fruit.id
;

INSERT INTO Recipe ( juice_id, fruit_id ) SELECT j.id, f.id
                                            FROM Recipe_tmp AS r, Juice AS j, Fruit AS f
                                              WHERE r.j_name = j.name AND r.f_name = f.name
;


DROP TABLE Recipe_tmp;

COMMIT;

DETACH DATABASE db1;
DETACH DATABASE db2;


 类似资料:
  • 问题内容: 所有,我必须创建一个具有基本架构的数据库。该数据库将很大(超过100GB),并将用作数据仓库。现在,该数据库的创建当前正在通过C#代码“一次命中”执行。从许多不同的来源中提取数据。由于数据量巨大,这种创建引起了一些问题。已经决定,与其一口气创建一个数据库,不如一次创建一个数据库。到 创建几个包含核心数据表的较小数据库。 将较小的数据库合并为一个较大的数据库。 建立架构/添加相关约束。

  • 这是我的密码: 我想知道如何将df3绑定到单个数据帧中作为"NA"s? 我在r_blogger上找到了一篇关于将向量或长度不等的数据帧组合成一个数据帧的文章。http://www.r-bloggers.com/r-combining-vectors-or-data-frames-of-unequal-length-into-one-data-frame/ 但是我从数据中得到的数据框,其中一些是空的

  • 问题内容: 如何从一个数据库复制到另一个数据库。 数据库名称visco 我想将所有表从visco数据库复制到新数据库名称作为neptune 我创建了一个没有任何表的数据库,然后尝试从database1.bak文件还原数据库,然后显示错误为 需要查询帮助 问题答案: 使用SQL Server Management Studio: 选项1 ->右键单击要复制的数据库 ->选择“任务”>“生成脚本” -

  • 有没有一个简单的方法可以做到这一点?

  • 问题内容: 我需要将数据从一个表复制到另一个表。这两个表几乎具有相同的结构,但是位于不同的数据库中。 我试过了 我尝试此操作,但跨数据库出现错误…未实现 问题答案: 这是一个非常简单的任务。只需为此目的使用dblink: 如果您需要定期从外部数据库中获取数据,明智的做法是定义服务器和用户映射。然后,您可以使用较短的语句:

  • 1、主键约束 主键列上没有任何两行具有相同值(即重复值),不允许空(NULL); 2、唯一性约束 保证一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一性约束允许为null,但是只能有一行; 3、唯一性索引 不允许具有索引值相同的行,从而禁止重复的索引和键值; 4、三者的区别 约束是用来检查数据的正确性; 索引是用来优化查询的; 创建唯一性约束会创建一个约束和一个唯一性