2

Могу ли я создать сгенерированный столбец в таблице A, который суммирует столбец в таблице B с таблицей A_id строки в таблице A?Подзапрос как сгенерированный столбец в mysql?

Предположим, у меня есть таблица семейств и таблица детей. Я хочу, чтобы возраст детей составлял для каждой семьи.

ALTER TABLE people.families 
ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
(SELECT SUM(age) FROM people.children WHERE family_id = people.families.id) STORED; 

ERROR 3102: Expression of generated column 'sumofages' contains a disallowed function. 

Я не могу сохранить его как тип ВИРТУАЛЬНЫЙ. Что я здесь делаю неправильно?

ALTER TABLE people.families 
ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
(SELECT SUM(age) FROM people.children WHERE family_id = people.families.id) VIRTUAL; 

ERROR 3102: Expression of generated column 'sumofages' contains a disallowed function. 

Я не знаю, какая функция запрещена. SUM, похоже, не так. Может быть, SELECT?

+0

Я не думаю, что MySQL поддерживает то, что вы пытаетесь сделать. Вы были бы довольны заявлением 'UPDATE'? –

+0

В настоящее время я использую суб-выбор. Я не хочу хранить данные на самом деле, у меня просто множество подвыборок, и я не мог найти окончательную документацию из MySQL, чтобы предположить, что она не поддерживается. В MariaDB документация предполагает, что она не поддерживается, и что сгенерированные выражения могут включать только данные из текущей строки. Я просто хотел быть уверенным, что у меня что-то не хватает. – user1955162

ответ

0

Попробуйте это ..

 
     ALTER TABLE people.families 
     ADD COLUMN sumofages DECIMAL(10,2) GENERATED ALWAYS AS 
     (SELECT SUM(CAST(age) as Decimal(10,2)) FROM people.children WHERE family_id =  people.families.id) VIRTUAL; 

Надеется, что это помогает ..

+0

ОШИБКА 3102 (HY000): выражение сгенерированного столбца «mrc» содержит запрещенную функцию. – user1955162

+0

Я все еще получил это, и мне пришлось отменить SUM (CAST() на CAST (SUM() – user1955162

3

Идее вычисляемого столбца для получения данных из других столбцов в записи, например, объедините код страны с почтовым индексом, чтобы вы могли хранить DE и 12345, и вы получите DE-12345, который вы могли бы использовать в адресе.

То, что вы пытаетесь сделать, однако, совершенно иное. Вы получаете доступ к данным из другой таблицы. Но данные таблицы могут измениться, поэтому при доступе к одной записи вы можете внезапно получить совершенно другой результат. Вычисляемые столбцы должны содержать детерминированные значения, поэтому они не изменяются, пока данные вашей записи не изменяются. Я не знаю о MySQL в этом отношении, но он, вероятно, запрещает недетерминированные данные, такие как ваш подзапрос.

Что вы на самом деле ищете - это вид. Вид может комбинировать выборки из разных таблиц так же, как вы этого хотите. Так что используйте

create view familydata as 
(
    select f.*, sum(c.age) as sumofages 
    from families f 
    join children c on c.family_id = f.id 
    group by f.id 
); 

или

create view familydata as 
(
    select f.*, 
    (
    select sum(age) 
    from children c 
    where c.family_id = f.id 
) as sumofages 
    from families f 
); 

Я надеюсь, что я получил правильный синтаксис.

5

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html

Сформированные выражения столбцов должны придерживаться следующих правил. Ошибка возникает, если выражение содержит запрещенные конструкции.

  • Подзапросы, параметры, переменные, хранимые функции и пользовательские функции не разрешены.

Разумно, что выражение для генерируемого столбца может ссылаться на только столбцы в одной и той же строке. Сгенерированный столбец не может использовать подзапросы или ссылаться на другие таблицы или функции с недетерминированным выходом.

Предположим, что сгенерированные столбцы помогли найти ссылки на перекрестные таблицы. В частности, рассмотрим случай генерируемых столбцов STORED.

Если вы обновляете таблицу, MySQL также должен будет обновлять любые ссылки в генерируемых столбцах в другом месте в базе данных, если они ссылаются на обновленную строку. Для MySQL было бы сложным и дорогостоящим отслеживать все эти ссылки.

Затем рассмотрите возможность добавления косвенных ссылок через хранимые функции.

Затем учтите, что ваше обновление относится к таблице InnoDB в транзакции, но сгенерированный столбец может находиться в таблице non-transaction (MyISAM, MEMORY, ARCHIVE и т. Д.). Если ваше обновление будет отражено в тех генерируемых столбцах, когда вы его сделаете? Что, если вы откажетесь? Должно ли ваше обновление отражаться во время вашего совершения? Затем, как должны переменные MySQL «очереди» для применения к этим таблицам? Что делать, если несколько транзакций фиксируют обновления, которые влияют на созданную ссылку на столбец? Какой из них должен выиграть, тот, который применял последнее изменение или то, что было последним?

По этим причинам нецелесообразно или эффективно разрешать генерируемые столбцы ссылаться на все, кроме столбцов одной и той же строки в одной таблице.

+1

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