【问题标题】:Inserting To Table With Auto Increment MYSQL使用自动增量 MYSQL 插入表
【发布时间】:2023-03-30 19:31:01
【问题描述】:

假设我创建了以下维度表:

create table schema1.DOMAIN (
    ID INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    DOMAIN_NAME VARCHAR(10)
);

我有一个日志表,其中 DOMAIN_NAME 是一列。我的目标是编写一个插入语句,该语句将使用 DOMAIN_NAME 的值填充此维度表,但前提是它们尚不存在。例如:

INSERT INTO schema1.DOMAIN (ID, DOMAIN_NAME)
select distinct DOMAIN_NAME from LOGS l where not exists (select 1 from schema1.DOMAIN d where d.domain_name = l.domain_name);

我实际上还没有在 MySQL 数据库上运行它,但我有以下问题:

  1. 请注意,我没有为插入的 schema1.DOMAIN 中的 ID 列提供值。这有关系吗?如果没有提供,它会简单地自动增加主键吗?还是会抛出错误?有没有办法避免提供这个 ID 并让它自动递增?这是我想要的行为。最好的方法是什么?

  2. 有没有更高效的方法来做到这一点?

  3. 无论 schema1.DOMAIN 为空还是已有记录,我都希望它能够正常工作,并且我们正在转储解析日志以获取新值。这两个目标不兼容吗?

【问题讨论】:

    标签: mysql sql select sql-insert ddl


    【解决方案1】:

    1.注意我没有为插入的 schema1.DOMAIN 中的 ID 列提供值。这有关系吗?如果没有提供,它会简单地自动增加主键吗?还是会抛出错误?有没有办法避免提供这个 ID 并让它自动递增?这是我想要的行为。最好的方法是什么?

    回答。 插入到 schema1.DOMAIN (DOMAIN_NAME) select distinct DOMAIN_NAME from LOGS l where not exists (select 1 from schema1.DOMAIN d where d.domain_name = l.domain_name);

    2.有没有更高效的方法来做到这一点?

    回答。左外连接会表现更好

    3.无论 schema1.DOMAIN 为空还是已有记录,我都希望它能够正常工作,并且我们正在转储解析日志以获取新值。这两个目标不兼容吗?

    回答。似乎兼容

    【讨论】:

      【解决方案2】:

      您要编写的查询 - 我刚刚从 insert 的列列表中删除了 id:它会在每次插入时自动递增:

      insert into schema1.domain (domain_name)
      select distinct domain_name 
      from logs l 
      where not exists (select 1 from schema1.domain d where d.domain_name = l.domain_name);
      

      您也可以使用insert ... on duplicate key 语法。这需要在domain 列上定义唯一约束:

      create table schema1.domain (
          id int auto_increment primary key not null,
          domain_name varchar(10) unique
      );
      

      那么你可以这样做:

      insert into schema1.domain (domain_name)
      select distinct domain_name from logs l 
      on duplicate key update domain = values(domain)
      

      当满足表中已经存在的domain 时,查询转到on duplicate key 子句,在该子句中执行虚拟操作。

      【讨论】:

      • 在第一个insert语句中,如果遇到新的domain_name,它会简单地自动增加ID列并且我没有提供它?
      • @ben890:是的,完全正确。
      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多