SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.02.2014 15:02:10

Lipcanin
Участник
Зарегистрирован: 24.02.2014
Сообщений: 3

Добавление данных из одной таблицы в другую

Добрый день, помогите пжлст!

Есть 2 таблицы users_hist и users.

Cтруктура users_hist

Field            Type            Collation                    Null
vc_reg    varchar(12)    cp1251_general_ci    NO
vc_fam    varchar(40)    cp1251_general_ci    NO
vc_nam    varchar(40)    cp1251_general_ci    NO
vc_ptr    varchar(40)    cp1251_general_ci    YES
vc_doc    varchar(8)    cp1251_general_ci    NO
in_doc    int(11)                                NO
vc_dov    varchar(30)    cp1251_general_ci    YES
dt_dov    date                                        YES
vc_tel    varchar(20)    cp1251_general_ci    YES
si_type    smallint(6)                                NO
ts_date    datetime                                NO

Структура users

vc_reg    varchar(12)    cp1251_general_ci    NO
ts_date    datetime                                NO

Нужно добавить в users_hist, все записи из таблицы users, если в users_hist отсутствует такой vc_reg.

Пытаюсь сделать так:

INSERT INTO `users_hist`
(`vc_reg`,
`vc_fam`,
`vc_nam`,
`vc_ptr`,
`vc_doc`,
`in_doc`,
`vc_dov`,
`dt_dov`,
`vc_tel`,
`si_type`,
`ts_date`)
select vc_reg, ts_date from users;

Но, из-за того что в users_hist есть обязательные поля и в них не указано значение по умолчанию, то получаю ошибку

10:29:12    INSERT INTO `users_hist` (`vc_reg`,`ts_date`) select vc_reg, ts_date from users    Error Code: 1364. Field 'vc_fam' doesn't have a default value    0.000 sec

Мне будет достаточно, чтобы обязательные поля заполнялись пробелами или пустыми строками.

Подскажите как это сделать.

Неактивен

 

#2 24.02.2014 15:05:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Добавление данных из одной таблицы в другую

В SELECT Вы должны перечислить все поля, которые не могут быть NULL и не имеют значения  по умолчанию.
Попробуйте конструкцию типа
insert into `t1`(a,b,c) select a,b,' ' FROM `t2`;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 24.02.2014 15:28:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Добавление данных из одной таблицы в другую

Ещё можно изменить режим.
SELECT @@session.sql_mode; -- посмотреть использующийся
SET @@session.sql_mode = ""; -- убрать все значения

Но:
1. Нужно внимательно изучить какие значения по умолчанию использует MySQL для тех или иных типов, чтобы не было сюрпризов.
2. Возможно строгий режим нужен для чего-то другого, ведь не зря же его включали. Как вариант, вы можете менять режим только на время выполнения данной команды, а потом возвращать прежние значения.

Вывод: вариант, предложенный deadka, оптимален.

Неактивен

 

#4 25.02.2014 07:58:54

Lipcanin
Участник
Зарегистрирован: 24.02.2014
Сообщений: 3

Re: Добавление данных из одной таблицы в другую

Спасибо, помогло, но получилось, что записи с одинаковым `vc_reg` дублируются. В таблице users содержаться все возможные записи с vc_reg, а в users_hist только часть.

Я дублирующиеся записи удалил другим запросом, а одним запросом как сделать чтобы не дублировалось? Для ликбеза.

Отредактированно Lipcanin (25.02.2014 08:02:00)

Неактивен

 

#5 25.02.2014 08:02:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Добавление данных из одной таблицы в другую

Что именно дублируется? Приведите пример на реальных данных - что получается, и что Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 25.02.2014 12:11:07

Lipcanin
Участник
Зарегистрирован: 24.02.2014
Сообщений: 3

Re: Добавление данных из одной таблицы в другую

В таблице users_hist содержаться данные:

vc_reg    ts_date
aaa            01.01.2013 15:39:27
bbb            03.01.2013 13:34:54
ccc            24.01.2013 9:23:31
ddd            27.01.2013 9:00:30


В users

vc_reg    ts_date
aaa            08.07.2013 9:26:43
bbb            08.07.2013 9:25:45
ccc            16.07.2013 13:58:42
ddd            16.05.2013 16:34:40
eee            07.02.2014 13:49:56
fff            18.05.2013 19:45:27

В результате запроса в users_hist получается

aaa    08.07.2013 9:26:43
aaa    01.01.2013 15:39:27
bbb    08.07.2013 9:25:45
bbb    03.01.2013 13:34:54
ccc    16.07.2013 13:58:42
ccc    24.01.2013 9:23:31
ddd    16.05.2013 16:34:40
ddd    27.01.2013 9:00:30
eee    07.02.2014 13:49:56
fff    18.05.2013 19:45:27

А хотелось бы

aaa    01.01.2013 15:39:27
bbb    03.01.2013 13:34:54
ccc    24.01.2013 9:23:31
ddd    27.01.2013 9:00:30
eee    07.02.2014 13:49:56
fff    18.05.2013 19:45:27

В итоге сам разобрался. Вот такой запрос нужен:

INSERT INTO users_hist
(`vc_reg`,
`vc_fam`,
`vc_nam`,
`vc_ptr`,
`vc_doc`,
`in_doc`,
`vc_dov`,
`dt_dov`,
`vc_tel`,
`si_type`,
`ts_date`)
select vc_reg, '', '', NULL, '', '0', NULL, NULL, NULL, '0', ts_date from users where users.vc_reg not in (select users_hist.vc_reg from users_hist) ;

В любом случае еще раз спасибо за наводку.

Неактивен

 

#7 25.02.2014 15:16:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Добавление данных из одной таблицы в другую

В старых версиях (до MySQL 5.6 и MariaDB 5.3) ваш запрос будет очень медленно работать на больших объемах. В такой ситуации имеет смысл его переписать через join.

select u.vc_reg, u.ts_date from users u left join users_hist uh on u.vc_reg=uh.vc_reg where uh.vc_reg is null;

Данный запрос определяет vc_reg и ts_date из users, которые необходимо добавить. Дополните его константами (null, 0, ''), чтобы использовать в вашем insert.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson