• В чем принципиальное отличие unique (constraints) от unique index?

    alekciy
    @alekciy
    Вёбных дел мастер
    Разница в том, что ограничения (сonstraints) призваны обеспечивать целостность данных, а индексы (index) — скорость доступа к данным. Это две абсолютно не связанные сущности. Причем если первое — часть SQL стандарта, то второе нет (ибо ни как не связанно с функциональностью языка, введение индексов — вынужденная мера). Разработчик сам решает, в каких случая применить эти механизмы и использование одного вовсе не требует использование другого.

    Теперь касательно уникальности (unique). В данном случае при добавлении ограничения уникальности (unique constraint) Postgresql сам навешивает на указанное поле индекс. Это просто особенность реализации в данной СУБД. Разработчики решили, что вот так оно будет работать и все тут (причем небезосновательно). В другой же схожей ситуации они решили, что разработчик сам думает, нужно ли ему использовать этих два механизма вместе, или нет. Я говорю об ограничении целостности по внешнему ключу (foreign key). В Postgresql индексы по полям с данным видом ограничения не создаются (Индексы по внешним ключам в Postgresql). А, к примеру, в MySQL создаются. Это особенность реализации в MySQL.

    Поэтому важно просто понимать, что это не связанные вещи, просто в некоторых реализациях они «сцеплены» между собой и создание некоторых видов ограничений приводит к автоматическому созданию индекса.
    Ответ написан
    2 комментария
  • Как удалить все строки из таблицы, кроме последних N?

    @okashirin
    оставляет пять последних записей, при условии, что id идут по порядку
    DELETE FROM gangs_actions
    WHERE gangs_actions_id < (SELECT MAX(gangs_actions_id) - 5 FROM (SELECT * FROM gangs_actions) tmp)


    а это твой запрос, только он будет работать
    DELETE FROM gangs_actions
    WHERE gangs_actions_id <= (
    SELECT gangs_actions_id FROM (SELECT * FROM gangs_actions) as tmp
    ORDER BY gangs_actions_id DESC
    LIMIT 5,1
    )
    Ответ написан
    1 комментарий
  • Что за ошибка докера?

    gecube
    @gecube
    системный администратор, программист... все дела..
    ну, все написано - когда монтируете, то можете только файл на файл или каталог на каталог монтировать. Иногда бывает, что если в volume слева указан файл, который на хосте не существует, то докер сходит с ума. И создает вместо него каталог с правами root:root.
    Какое может быть решение? Для начала прекратить пользоваться упрощенным синтаксисом -v в docker run или volumes в docker-compose, а использовать расширенный синтаксис mount (который с --mount). Тогда, если на хосте нет нужного файла, то докер контейнер ТУПО не стартанет и будет внятное сообщение об ошибке вроде:

    docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /home/local/georg.gaal/formulas.
    See 'docker run --help'.


    При этом Вы еще бонусом и получаете то, что докер не будет пытаться изменить права на каталог. А создаваемые внутри файлы будут с теми правами, которые установлены внутри контейнера - сплошная лепота. Минус в том, что все необходимые каталоги и файлы для запуска контейнера надо создавать заранее. Т.е. уже коллегам надо отдавать докер-компоуз файл плюс bash-скрипт
    Ответ написан
    2 комментария