Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2016, 16:26   #1
Mike05
 
Регистрация: 20.06.2009
Сообщений: 3
По умолчанию Вставка с копированием ключа в другое поле

MySql
Код:
CREATE TABLE `mytabl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `copyid` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

INSERT INTO `mytabl`(`id`, `copyid`) VALUES (NULL,`id`)
Подскажите, пожалуйста, можно ли как-то одним запросом вставлять в другое поле новое значение ключа прямо при вставке строки? В примере выше - не работает (вставляет во второе поле ноль).
Mike05 вне форума Ответить с цитированием
Старый 15.09.2016, 16:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А зачем поле дубль ключа?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.09.2016, 16:59   #3
Mike05
 
Регистрация: 20.06.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем поле дубль ключа?
В части случаев оно не будет дублем. Но когда будет, то хотелось бы сразу сделать, если это возможно.
Mike05 вне форума Ответить с цитированием
Старый 15.09.2016, 17:06   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

не уверен, но я бы попробовал сделать триггер на таблицу (на INSERT), и в этом триггере уже использовал ID как задумано.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.09.2016, 15:31   #5
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Mike05 Посмотреть сообщение
Подскажите, пожалуйста, можно ли как-то одним запросом вставлять в другое поле новое значение ключа прямо при вставке строки?
Для MySQL - можно с вложенным селектом:
INSERT INTO `mytabl` SET `copyid` = ( (select LAST_INSERT_ID()) +1 )

но такие выкрутасы крайне нежелательны, тк теряется прозрачность и понятность кода. И автоинкремент у поля может быть не 1 а любое число.

И LAST_INSERT_ID() не всегда показывает именно на последнюю вставленную запись. Например после запросов с хвостом ... ON DUPLICATE KEY UPDATE ID=LAST_INSERT_ID(ID)

И для InnoDB таблиц конструкция "ON DUPLICATE KEY UPDATE" ведёт себя по особенному

В итоге, внешне безобидная конструкция может начать вести себя непредсказуемо и зависеть от других запросов и типа таблиц.

Последний раз редактировалось predefined; 16.09.2016 в 15:53.
predefined вне форума Ответить с цитированием
Старый 16.09.2016, 16:27   #6
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
В части случаев оно не будет дублем. Но когда будет, то хотелось бы сразу сделать, если это возможно.
Так дублировать зачем, вас спрашивают? проблема только тут, сделайте нулл на поле и проблемы не будет.
come-on вне форума Ответить с цитированием
Старый 20.09.2016, 13:38   #7
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

come-on, судя по таблице в стартпосте это поле у него не индексное, проблемы и сейчас нет. Но с архитектурой хранения данных явно есть какие траблы, раз такие выкрутасы делает.
predefined вне форума Ответить с цитированием
Старый 20.09.2016, 14:24   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
INSERT INTO `mytabl`(`id`, `copyid`) VALUES (NULL,`id`)
Вы же сами хотите вставить нулевое(NULL) значение в ПОЛЕ неприемлемлющее такие значение (NOT NULL) вот он и ругается.
Код:
INSERT INTO `mytabl`(`id`, `copyid`) VALUES (NULL,`id`)
и будет вам счастье.
Автоинкремент работает если в запросе совсем НЕ УКАЗАНО это поле.
Если поле указано, то он(SQL движок) честно "пытается" подставить указанное значение.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 20.09.2016, 14:39   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Наверно и мускул так не позволит, сиквел уж точно не разрешает таких фокусов. Логично - в этот момент нет значения id да и любого другого поля

Код:
INSERT INTO MyTable (Id1) VALUES(Id+1)
Server: Msg 128, Level 15, State 1, Line 1
The name 'Id' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.09.2016, 15:44   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

зачем решать проблемы которых нет?
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка в поле Kot070 Microsoft Office Access 2 07.06.2015 18:00
переход в другое поле после ввода буквы ГОСЕАН Помощь студентам 6 10.01.2012 09:36
После ввода в поле по Enter нужно перейти на другое поле! •ScReam•™ Помощь студентам 2 16.06.2009 08:47
Вставка в поле MEMO Joe_Tribbiani БД в Delphi 7 20.04.2009 20:02
Вставка в поле Edit EVO-X Общие вопросы Delphi 10 11.07.2008 22:25