Relacja jeden do wielu między 2 kolumnami w jedej tabeli

0

Witam,

chciałem napisać relację 1 do wielu w jednej tabeli z bazy danych. To ma wyglądać tak: mam takie kolumny w bazie:

id

name

parent_id

Ta tabela ma tworzyć drzewo kategorii docelowo. I chcę, że gdy będzie parent_id = NULL, to wtedy to jest kategoria główna, jednak, gdy ma jakieś parent_id, to to jest podkategoria. Chciałbym wymusić poprzez relację integralność danych tak, żeby nie można było dać parent_id do kategorii, która nie posiada takiego identyfikatora

0

ale z czym masz problem???

0

no z tym, że nie mogę zrobić tej relacji
próbowałem np czegoś takiego

 CREATE TABLE IF NOT EXISTS `cms`.`article_category` (
`id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`created_at` DATETIME NOT NULL ,
`updated_at` DATETIME NOT NULL ,
`parent_id` INT( 11 ) NULL ,
PRIMARY KEY ( `id` , `parent_id` ) ,
INDEX `fk_article_category_article_category1` ( `parent_id` ASC ) ,
CONSTRAINT `fk_article_category_article_category1` FOREIGN KEY ( `parent_id` ) REFERENCES `cms`.`article_category` (
`id` 
) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE = InnoDB DEFAULT CHARACTER SET = latin2;
0
CREATE TABLE IF NOT EXISTS `cms`.`article_category` (
`id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`created_at` DATETIME NOT NULL ,
`updated_at` DATETIME NOT NULL ,
`parent_id` INT( 11 ) NULL ,
PRIMARY KEY ( `id` , `parent_id` ) ,
INDEX `fk_article_category_article_category1` ( `parent_id` ASC )
) ENGINE = InnoDB DEFAULT CHARACTER SET = latin2;

ALTER TABLE `cms`.`article_category` ADD FOREIGN KEY ( `parent_id` ) REFERENCES `cms`.`article_category` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
0

#1005 - Can't create table 'cms.#sql-4e9_98' (errno: 150)

gdy wykonuję

 ALTER TABLE `cms`.`article_category` ADD FOREIGN KEY ( `parent_id` ) REFERENCES `cms`.`article_category` (
`id` 
) ON DELETE NO ACTION ON UPDATE NO ACTION ;
0

nie zwróciłem uwagi
id BIGINT( 20 )
parent_id INT( 11 )
typy muszą być takie same

0

no teraz zapytanie przeszło, ale przy dodawaniu rekordów mam

#1452 - Cannot add or update a child row: a foreign key constraint fails (cms.article_category, CONSTRAINT article_category_ibfk_1 FOREIGN KEY (parent_id) REFERENCES article_category (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

zapytanie jakie chciałem wykonać

INSERT INTO `cms`.`article_category` (
`id` ,
`name` ,
`created_at` ,
`updated_at` ,
`parent_id` 
)
VALUES (
NULL , 'test', '2011-02-25 20:33:42', '2011-02-25 20:33:42', '0'
) 

a gdy chciałem dać jako parent_id NULL

 INSERT INTO `cms`.`article_category` (
`id` ,
`name` ,
`created_at` ,
`updated_at` ,
`parent_id` 
)
VALUES (
NULL , 'test', '2011-02-25 20:33:42', '2011-02-25 20:33:42', NULL
)

to dostałem komunikat, że nie może być tam NULL. Jest możliwe zrobić coś takiego w mysql?

Chcę dodać np takie rekordy

id nazwa created_at update_at parent_id
NULL Filmy 2011-02-25 2042 2011-02-25 2042 NULL
NULL Przygodowe 2011-02-25 2042 2011-02-25 2042 (id 1 rekordu)
NULL Bajki 2011-02-25 2042 2011-02-25 2042 (id 1 rekordu)
NULL Bajki braci Grimm 2011-02-25 2042 2011-02-25 2042 (id 3 rekordu)
NULL Horrory 2011-02-25 2042 2011-02-25 2042 (id 1 rekordu)

żeby uzyskać taką hierarchię:

  • Filmy
    --Przygodowe
    --Bajki
    ---Bajki braci Grimm
    --Horrory
0

INSERT INTO cms.article_category (name ,created_at ,updated_at ,parent_id)
VALUES ('test', '2011-02-25 2042', '2011-02-25 2042', NULL)

i kolumnę parent_id masz jako NULL :>

0

w tym problem, że nie :)

#1048 - Column 'parent_id' cannot be null

0

i kolumnę parent_id masz jako NULL :>

0

czyli mam rozumieć, że się nie da tak? :P

0

sory, ale już Cię nie rozumiem

0

czy kolumnę parent_id masz zadeklarowaną jako NULL czy jako NOT NULL??

0

a to było pytanie :D

no daję

ALTER TABLE `article_category` CHANGE `parent_id` `parent_id` BIGINT( 20 ) NULL DEFAULT '0' 

jednak nadal wyskakuje mi ten sam błąd, a wartość NULL się nie zmienia

CREATE TABLE IF NOT EXISTS `article_category` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `parent_id` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`,`parent_id`),
  KEY `fk_article_category_article_category1` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ;

ALTER TABLE `article_category`
  ADD CONSTRAINT `article_category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `article_category` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION; 
0

mamo.....
jakie default 0 - to przecież jak próbujesz wstawić null to on wtedy tam wstawia 0 a przecież nie masz rekordu z id=0
trochę myślenia nad tym co się robi

0

wiem, ale ja nie wstawiałem tam tego DEFAULT...

robię tak:

CREATE TABLE IF NOT EXISTS `article_category` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `parent_id` BIGINT(20) NULL,
  PRIMARY KEY (`id`,`parent_id`),
  KEY `fk_article_category_article_category1` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=1 ; 

następnie patrzę na bazę danych i mam tam DEFAULT 0 oraz NULL 'nie', no to daję

 ALTER TABLE `article_category` CHANGE `parent_id` `parent_id` BIGINT( 20 ) NULL DEFAULT NULL 

ale jest bez zmian...

0

wywaliłem wpisy

KEY `fk_article_category_article_category1` (`parent_id`) 

oraz

PRIMARY KEY (`id`,`parent_id`), 

zmieniłem na

 PRIMARY KEY (`id`),

i zaczęło działać :D dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1