Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, помогите пжлст!
Есть 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
Мне будет достаточно, чтобы обязательные поля заполнялись пробелами или пустыми строками.
Подскажите как это сделать.
Неактивен
В SELECT Вы должны перечислить все поля, которые не могут быть NULL и не имеют значения по умолчанию.
Попробуйте конструкцию типа
insert into `t1`(a,b,c) select a,b,' ' FROM `t2`;
Неактивен
Ещё можно изменить режим.
SELECT @@session.sql_mode; -- посмотреть использующийся
SET @@session.sql_mode = ""; -- убрать все значения
Но:
1. Нужно внимательно изучить какие значения по умолчанию использует MySQL для тех или иных типов, чтобы не было сюрпризов.
2. Возможно строгий режим нужен для чего-то другого, ведь не зря же его включали. Как вариант, вы можете менять режим только на время выполнения данной команды, а потом возвращать прежние значения.
Вывод: вариант, предложенный deadka, оптимален.
Неактивен
Спасибо, помогло, но получилось, что записи с одинаковым `vc_reg` дублируются. В таблице users содержаться все возможные записи с vc_reg, а в users_hist только часть.
Я дублирующиеся записи удалил другим запросом, а одним запросом как сделать чтобы не дублировалось? Для ликбеза.
Отредактированно Lipcanin (25.02.2014 08:02:00)
Неактивен
Что именно дублируется? Приведите пример на реальных данных - что получается, и что Вы хотите получить.
Неактивен
В таблице 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) ;
В любом случае еще раз спасибо за наводку.
Неактивен
В старых версиях (до MySQL 5.6 и MariaDB 5.3) ваш запрос будет очень медленно работать на больших объемах. В такой ситуации имеет смысл его переписать через join.
Неактивен