SQLite和多个插入清洁

SQLite和多个插入清洁,sqlite,Sqlite,我想在SQLite数据库中填充一个新创建的表 在这个表中,一些键是对其他表的引用,我不想硬编码这些引用 ->我目前正在使用一个“映射”表,以便使用名称(~常量)获取ID 问题是:这个解决方案有效,但非常冗长 最简单的工作示例:(存储字典单词,使用类别表的外键) 现在,问题的核心是:太冗长了。 本例中只有一个外键,插入几个来说明问题 INSERT INTO words(id_category, name) VALUES ((SELECT value FROM CONSTANTS WHERE

我想在SQLite数据库中填充一个新创建的表

在这个表中,一些键是对其他表的引用,我不想硬编码这些引用 ->我目前正在使用一个“映射”表,以便使用名称(~常量)获取ID

问题是:这个解决方案有效,但非常冗长

最简单的工作示例:(存储字典单词,使用类别表的外键)

现在,问题的核心是:太冗长了。 本例中只有一个外键,插入几个来说明问题

INSERT INTO words(id_category, name) VALUES
   ((SELECT value FROM CONSTANTS WHERE name = "category_noun"),
    "hello"),

   ((SELECT value FROM CONSTANTS WHERE name = "category_abreviation"),
    "SO"),

   ((SELECT value FROM CONSTANTS WHERE name = "category_abreviation"),
    "user"),

   ((SELECT value FROM CONSTANTS WHERE name = "category_character"),
    "!")
;
我想要一些类似于伪sqlite代码的东西:

-- same table creations as before

INSERT INTO words(id_category, name) VALUES
   -- Fetch constants once
    CAT_NOUM  = SELECT value FROM CONSTANTS WHERE name = "category_noum"),
    CAT_ABREV = SELECT value FROM CONSTANTS WHERE name = "category_abreviation"),
    CAT_CHAR = SELECT value FROM CONSTANTS WHERE name = "category_abreviation")
   )

   -- Fill the table, using constants
   (CAT_NOUM, "Hello"),
   (CAT_ABREV, "SO"),
   (CAT_NOUM, "user"),
   (CAT_CHAR, "SO"),
   ...
;
我想知道

  • 这个问题已经有了SQLite解决方案
  • 我应该使用
    sed
    之类的东西,在SQLite脚本中用它的
    grep
    ed值替换硬编码的字符串,如uuu sed\uu CAT\u NOUM
  • 以编程方式做这些事情是正确的方法

最好使用
INSERT…选择
UNION ALL
而不是
INSERT…value

INSERT INTO words(id_category, name) 
SELECT value, 'hello' FROM CONSTANTS WHERE name = 'category_noun' UNION ALL
SELECT value, 'SO' FROM CONSTANTS WHERE name = 'category_abreviation' UNION ALL
SELECT value, 'user' FROM CONSTANTS WHERE name = 'category_abreviation' UNION ALL
SELECT value, '!' FROM CONSTANTS WHERE name = 'category_character'; 
请参阅。

或用于连接到
常量

INSERT INTO words(id_category, name) 
SELECT c.value, t.column2
FROM CONSTANTS C INNER JOIN (
  VALUES ('category_noun', 'hello'),
         ('category_abreviation', 'SO'),  
         ('category_abreviation', 'user'),
         ('category_character', '!')  
) t ON t.column1 = c.name; 
请参阅。

结果:

SELECT * FROM words;

| id  | id_category | name  |
| --- | ----------- | ----- |
| 1   | 1           | hello |
| 2   | 2           | SO    |
| 3   | 2           | user  |
| 4   | 3           | !     |

什么是
id\u语言
名称
?我在
单词的定义中没有看到它们。对不起,你说得对,我修正了这个例子。我只是测试了一下;复制粘贴+
从单词中选择*现在可以了,谢谢
SELECT * FROM words;

| id  | id_category | name  |
| --- | ----------- | ----- |
| 1   | 1           | hello |
| 2   | 2           | SO    |
| 3   | 2           | user  |
| 4   | 3           | !     |