Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица users MyISAM поля такие:
id int primary key not null auto_increment unsigned default null
date timestamp(10) not null
name char(20) not null
last_name char(20) not null
Для вставки данных набираю:
insert into users values ('name', 'last_name');
т.е хочу чтобы id и date вставились автоматом, но получается ошибка.
А если набирать: insert into users values (null, null, 'name', 'last_name');
или insert into users (name, last_name) values ('name', 'last_name'); то всё работает как надо...
Так вот собственно вопрос: как сделать так, чтобы не набирать каждый раз NULL?
PS надеюсь объяснил правильно....
Неактивен
Версия сервера, режим его работы? Описание поля id вызывает большие сомнения. Вы там ничего не напутали?
Отредактированно honomer (04.07.2009 15:25:16)
Неактивен
Версия сервера написал:
mysql Ver 14.14 Distrib 5.1.35, for redhat-linux-gnu (x86_64) using readline 5.1
Описание поля id вызывает большие сомнения. Вы там ничего не напутали? написал:
Да нет вроде...
Вот так, точно: ID tinyint(4) unsigned not null primary key auto_increment
Неактивен
Нужно посмотреть режим работы сервера. Понять не могу как не вылезает ошибка при назначении null полю, которое не может этот null содержать в принципе. Сервак выдает какие-нибудь сообщения сообщения? Еще желательно увидеть текст сообщения об ошибки, которая вылезает в первом варианте оператора вставки. Мне кажется, что проблема в том, что полю date не назначено значение по дефолту. Не всегда можно воспользоваться автоназначением полю типа timestamp текущей даты.
Неактивен
При первом варианте:
ERROR 1136 (21S01): Column count doesn't match value count at row 1
Для date по дефолту: CURRENT_TIMESTAMP
А что значит: режим работы сервера? И где (как) это узнать?
Отредактированно Simon-n70 (04.07.2009 16:34:10)
Неактивен
1. Сообщение об ошибке переводится как "число столбцов не совпадает с числом значений в строке 1". Просто нужно перечислить те поля, которым ты назначаешь значения в предложении VALUES. В третьем варианте ты использовал верный синтаксис. Ошибка в первом варианте вылезла потому, что можно опускать список полей только в случаях, когда: значения указываются для всех полей таблицы и эти значения для полей перечислены в том порядке, в котором поля следовали при создании таблицы в операторе CREATE TABLE. Если ты создал поля со значениями по умолчанию и они идут подряд в начале или в конце списка полей в CREATE TABLE, то список полей в операторе INSERT также можно опустить. В остальных случаях вылезет ошибка, такая как у тебя. В твоем случае проблема как раз с полем date - для него ты не задал значения по дефолту.
2. Для каждого типа существует значение, которое может быть задано по дефолту, даже если ты его и не указывал при создании или изменении таблицы. Но такое поведение не соответствует стандарту языка SQL.
3. Сервер MySQL может работать в несколких режимах. Режим работы сервера влияет на то какие ситуации сервер будет считать ошибками, и то как он будет на них реагировать. Я так понимаю, что ты не менял режим работы сервера, а оставил все по умолчанию (режим TRADITIONAL). Этот режим является составным и в нем используется режим STRICT_ALL_TABLES. Это означает, что для всех типов таблиц, включая и MyISAM, используются более строгие правила толкования операторов SQL. Нестандартное поведение приводит к появлению ошибок. Об этом я уже писал в пункте 2.
Тебе нужно изменить таблицу, используя ALTER TABLE. Изменять нужно описание поля date чтобы задать ему явно значение по умолчанию. Выглядеть описание поля date должно следующим образом:
Отредактированно honomer (04.07.2009 17:04:16)
Неактивен
Э-э... Как бы это сказать.... Вобщем я тут попробовал сам поковыряться. Ты знаешь, даже с явным указанием значения по умолчанию не получится сделать то, что ты хочешь. Все равно придется либо писать null в предложении VALUES, либо перечислять поля, которым назначаешь значения. Похоже что то, что получается в других СУБД здесь не прокатывает. Однако, карма...
Неактивен
Спасибо тебе огромное. Но тут, во всей фигне, есть один вариант, про который я не говорил.... Когда я первый раз использовал MySQL (было это на Windows XP SP3) всё было именно так как я хотел. Потом попробывал на Ubuntu ничего не изменилось... Теперь я использую Fedora 11. И вот такая фигня. (см. выше) Уже чуть голову не сломал, ничего не выходит. Даже без поля DATE! Просто с ID...
Как переводится на русский эта ошибка я знаю. Мне больше было интересно ПОЧЕМУ она возникает! Ведь раньше у меня такого не было.........
Ещё раз спасибо.
Неактивен
Ну, что сказать?.. MySQL всегда был славен более слабой поддержкой стандартов нежели другие СУБД. Могу посоветовать только одно: не надейся на разные примочки а-ля мускул. Алилуйя!
Неактивен
Ух, какое обсуждение Отвечу, пожалуй, на изначальный вопрос.
Правильный синтаксис такой:
Неактивен
Похоже что еще не очень хорошо. Согласитесь, что поддержка тех или иных положений стандарта зависит от выбранных режимов работы и типа таблиц, что иной раз сильно напрягает.
А какая СУБД позволит это сделать без указания колонок?
SQL Server 2005 спокойно распознает по крайней мере наличие автоинкрементного поля. Во всяком случае синтаксис
Отредактированно honomer (06.07.2009 13:30:37)
Неактивен
Подозрительно, не должно было работать ни в каких режимах
--
Надо попробовать в MSSQL, это прикольно, если они умеют вычленять автоинкременты
Неактивен