• Как правильно написать TRIGGER?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для PostgreSQL триггер не нужен. Делается через генерируемое поле как-то так:
    CREATE TABLE "table" (
      field1 VARCHAR(16),
      field2 INT GENERATED ALWAYS AS (
        ARRAY_POSITION(ARRAY['value1', 'value2', 'value3', 'value4'], field1::TEXT)
      ) STORED
    );

    Или, если значения идут не по порядку, то
    CREATE TABLE "table" (
      field1 VARCHAR(16),
      field2 INT GENERATED ALWAYS AS (
        (ARRAY[0, 11, 22, 44])[ARRAY_POSITION(ARRAY['value1', 'value2', 'value3', 'value4'], field1::TEXT)]
      ) STORED
    );

    В самом запущенном случае можно так:
    CREATE TABLE "table" (
      field1 VARCHAR(16),
      field2 INT GENERATED ALWAYS AS (
        CASE field1
          WHEN 'value1' THEN 0
          WHEN 'value2' THEN 11
          WHEN 'value3' THEN 22
          ELSE 44
        END
      ) STORED
    );
    Ответ написан
    1 комментарий
  • Как синхронизировать столбцы в SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если связь между значениями - статическая, жёсткая и никогда не изменяемая, то используйте вычисляемое поле (generated column). Если значение поля, от которого зависит другое поле - числовое от единицы и далее, можно обойтись одним полем типа ENUM.

    Если же связь более сложная и/или может меняться со временем, то гораздо разумнее не заполнять второе поле в зависимости от первого, а использовать его значение как ссылку (foreign key) в словарную таблицу.

    Крайний случай - использование BEFORE INSERT/UPDATE триггеров.
    Ответ написан
    Комментировать
  • Как исправить ошибку mysql #1118 - Row size too large?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    RTFM
    The maximum row size for an InnoDB table, which applies to data stored locally within a database page, is slightly less than half a page for 4KB, 8KB, 16KB, and 32KB innodb_page_size settings.
    Ответ написан
    2 комментария