1. SQL / Говнокод #12427

    −139

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    CREATE TABLE `forums_list`(
        `forum_id` int unsigned NOT NULL AUTO_INCREMENT,
         ...
        `created` datetime NOT NULL DEFAULT NULL,
        `updated` datetime NOT NULL DEFAULT NULL,

    Запостил: Alex_Slubsky, 16 Января 2013

    Комментарии (20) RSS

    • Опять мистер мускул рвёт все шаблоны проектирования баз данных.
      Ответить
      • Чак Норрис же. Только ему под силу сохранить NULL в поле с ограничением NOT NULL.
        Ответить
        • Норрис он такой: http://www.youtube.com/watch?v=QSjqZsIzk7k
          Ответить
    • Может ли всемогущий бог сотворить камень, который он, будучи всемогущим, не сможет поднять?
      Ответить
      • Если он всемогущий, но не тупой, то он не будет страдать всякой фигней, а скажет "ну и нахрена я буду это делать?", тем самым он докажет свое всемогущество.
        Ответить
        • Нет. Он сотворит большой камень и придавит им просящего.
          А когда тот задыхаясь и плача от боли начнёт просить "Подними, прошу".
          То голос с небес ответит "Не могу", и узрит облака в форме троллфейса.
          >тем самым он докажет свое всемогущество.
          Ответить
    • Что-то я не уловил: что не так?
      Ответить
      • NOT NULL DEFAULT NULL
        Ответить
        • И что? Это означает, что дефолт недопустим, значение при инсерте должно быть указано прямо. Почему так писать нельзя?
          Ответить
          • Ок. Тогда попробуйте просто выполнить этот CREATE TABLE, получите SQL Error (1067): Invalid default value
            Ответить
            • Я работаю с PostgreSQL и у нас вполне работает такое:

              CREATE TABLE "forums_list"(
                  "forum_id" serial NOT NULL,
                  "created" timestamp NOT NULL DEFAULT NULL,
                  "updated" timestamp NOT NULL DEFAULT NULL
              )


              Не знал, что в MySQL с этим проблемы.
              Ответить
              • Но нахуя зачем? Видя поле с ограничением NOT NULL я предполагаю, что в нем NULL'ов нет и не будет, и буду писать запросы и код согласно этому... а тут такое западло, которое прёт против здравого смысла (и походу стандарта SQL).
                Ответить
                • А вдруг кто-то другой попробует сунуть что-нибудь в эту таблицу, не указав значения этого поля? Впрочем, если ткнёте в стандарт конкретнее, буду благодарен, любопытно.
                  Ответить
                  • > А вдруг кто-то другой попробует сунуть что-нибудь в эту таблицу, не указав значения этого поля?
                    Смотрите тест ниже. Если значение поля не указано, не прописан DEFAULT и стоит NOT NULL, то ни в одной субд такая запись не вставится.
                    Ответить
              • P.S. Создаваться то она создается. Только вот дефолт все равно не работает:
                postgres=# create table test(id integer, test timestamp not null default null);
                postgres=# insert into test (id, test) values(1, now());
                INSERT 0 1
                postgres=# insert into test (id) values(2);
                ERROR:  null value in column "test" violates not-null constraint
                Так что смысла это извращение не имеет даже в постгре, т.к. без дефолта происходит ровно тоже самое:
                postgres=# create table test2(id integer, test timestamp not null);
                CREATE TABLE
                postgres=# insert into test2 (id, test) values(2, now());
                INSERT 0 1
                postgres=# insert into test2 (id) values(3);
                ERROR:  null value in column "test" violates not-null constraint
                Ответить
                • То есть он работает, хотя и действительно не имеет смысла, потому что всегда подразумевается.
                  Ответить
                  • Ну да, насчет стандарта я конечно погорячился. DEFAULT NULL там и так по дефолту. Именно поэтому оба теста выдают одинаковый результат.

                    Но против запрета NOT NULL DEFAULT NULL в mysql ничего не имею, т.к. если уж явно написал DEFAULT - согласно здравому смыслу этот DEFAULT должен удовлетворять всем ограничениям, наложенным на колонку. Ведь DEFAULT, который не позволяет опустить данное поле в insert'е не выполняет своего главного предназначения...
                    Ответить
    • Может, это как девственность. По умолчанию NULL, а потом как испортили, уже никогда NULL не станет.
      Ответить
    • И че, неужели БД ЭТО прожевывает?
      Ответить

    Добавить комментарий