Estou usando o MariaDB 10.3, e o que estou tentando fazer é estabelecer um relacionamento 1-para-n conforme especificado por exemplo aqui na seção "Relacionamento um-para-muitos". Estou tentando fazer isso via:
CREATE TABLE test_table (
ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
test_value INT NOT NULL DEFAULT ID
);
CREATE TABLE related_table (
ID INT NOT NULL,
message VARCHAR(10) NOT NULL DEFAULT 'hello',
FOREIGN KEY (ID) REFERENCES test_table(test_value)
ON DELETE CASCADE
ON UPDATE RESTRICT
)
O SQL Fiddle Editor etc. falha na execução disso, com o erro:
Function or expression 'AUTO_INCREMENT' cannot be used in the DEFAULT clause of 'ID'
Portanto, suponho que você não possa definir o valor padrão de uma coluna igual a outra coluna, se o valor dessa outra coluna for definido por uma função ou expressão?
Se eu omitir o AUTO_INCREMENT
, obtenho:
Can't create table "fiddle"."related_table" (errno: 150 "Foreign key constraint is incorrectly formed")
Portanto, presumo que você não possa criar restrições FOREIGN KEY com base em colunas referenciadas com um valor padrão?
Você vê outra possibilidade de fazer o que preciso, que é:
A) Quando insiro um novo registro em test_table
e não forneço test_value
, seu valor deve ser igual à chave primária do registro inserido, que deve ser gerada automaticamente.
B) O related_table
's ID
deve referir-se ao test_table
's test_value
como chave estrangeira.
A única solução alternativa que vejo atualmente é:
CREATE TABLE test_table (
ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
test_value INT NOT NULL
);
CREATE TABLE related_table (
ID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
message VARCHAR(10) NOT NULL DEFAULT 'hello',
FOREIGN KEY (ID) REFERENCES test_table(test_value)
ON DELETE CASCADE
ON UPDATE RESTRICT
);
E então, se eu inserir, por exemplo, 3 registros em test_table
:
- Insira o primeiro novo registro em
test_table
e pegue o arquivoLAST_INSERT_ID
. - Atualize o primeiro registro recém-criado definindo o valor dele
test_value
igual ao retornadoLAST_INSERT_ID
. - Insira os dois registros restantes em
test_table
, desta vez diretamente com oLAST_INSERT_ID
retornado de antes como o valor detest_value
. - Insira um novo registro
related_table
com o valor do retornadoLAST_INSERT_ID
como seuID
campo de chave primária.
Mas isso parece complicado demais. Não existe uma solução melhor para este caso de uso?