Вставка в таблицу с автоинкрементом MYSQL - PullRequest
0 голосов
/ 20 апреля 2020

Допустим, я создал следующую таблицу измерений:

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. Обратите внимание, что я не сделал ' t предоставить значение для столбца ID в schema1. DOMAIN для вставки. Имеет ли это значение? Если он не указан, будет ли он автоматически увеличивать первичный ключ? Или это выдаст ошибку? Есть ли способ избежать предоставления этого идентификатора и автоматически увеличивать его? Это желаемое поведение для меня. Каков наилучший способ сделать это?

  2. Есть ли более эффективный способ сделать это?

  3. Я хочу, чтобы это работало независимо от того, является ли schema1.DOMAIN пустым или уже имеет записи, и мы дамп разбираем журнал для нового значения. Являются ли эти две цели несовместимыми?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

1.Примечание Я не указал значение для столбца ID в schema1. DOMAIN для вставки. Имеет ли это значение? Если он не указан, будет ли он автоматически увеличивать первичный ключ? Или это выдаст ошибку? Есть ли способ избежать предоставления этого идентификатора и автоматически увеличивать его? Это желаемое поведение для меня. Каков наилучший способ сделать это?

Ответ. INSERT INTO schema1. DOMAIN (DOMAIN_NAME) выбрать отличное DOMAIN_NAME из LOGS l, где его нет (выберите 1 из schema1.DOMAIN d, где d.domain_name = l.domain_name);

2.Есть еще эффективный способ сделать это?

Отв. Левое внешнее объединение будет работать лучше

3. Я хочу, чтобы это работало, независимо от того, является ли schema1.DOMAIN пустым или уже имеет записи, и мы дамп разбираем журнал для нового значения. Являются ли эти две цели несовместимыми?

Отв. Кажется совместимым

1 голос
/ 20 апреля 2020

Запрос, который вы хотели написать - я только что удалил id из списка столбцов для insert: он будет автоматически увеличиваться автоматически при каждой вставке:

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, где выполняется фиктивная операция.

...