Помогите с CONSTRAINT

Sanprof
Дата: 26.12.2012 13:16:30
CREATE TABLE admins
(
  id        integer NOT NULL AUTO_INCREMENT,
  id_parent integer,
  login     VARCHAR(20) NOT NULL,
  password  VARCHAR(32) NOT NULL,
  email     VARCHAR(50) NOT NULL,
  avatar    BLOB,
  CONSTRAINT pk_admins PRIMARY KEY (id),
  CONSTRAINT u_login UNIQUE (login),
  CONSTRAINT u_email UNIQUE (email)
)
ENGINE=InnoDB DEFAULT CHARSET=cp1251;


собственно в этой таблице не должно быть двух и более записей имеющих id_parent = NULL, тоесть должна быть только одна запись имеющая id_parent равным NULL, но id_parent не NULL может иметь одинаковое значение для нескольких записей.
По сути есть ТОЛЬКО один суперадмин (id_parent = NULL), создающий всех остальных, а те могут создавать следующих.
Еще нужен CONSTRAINT, чтобы при удалении простого админа производные принимали его бывший id_parent.
Удаление суперадмина ведет к удалению всех админов.
Sanprof
Дата: 26.12.2012 13:24:10
на удаление админа может какой-нить тригер повесить???
Sanprof
Дата: 26.12.2012 13:29:04
DROP TRIGGER IF EXISTS `__tr_del_admin`;
DELIMITER $$
CREATE TRIGGER __tr_del_admin BEFORE DELETE ON admins
  FOR EACH ROW BEGIN
	UPDATE admins SET id_parent=OLD.id_parent WHERE id_parent=OLD.id;
  END $$
DELIMITER ;
Sanprof
Дата: 26.12.2012 13:31:10
теперь таблицу можно записать так
CREATE TABLE admins
(
  id        integer NOT NULL AUTO_INCREMENT,
  id_parent integer,
  login     VARCHAR(20) NOT NULL,
  password  VARCHAR(32) NOT NULL,
  email     VARCHAR(50) NOT NULL,
  avatar    BLOB,
  CONSTRAINT pk_admins PRIMARY KEY (id),
  CONSTRAINT fk_admins_parent FOREIGN KEY (id_parent)
      REFERENCES admins (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT u_login UNIQUE (login),
  CONSTRAINT u_email UNIQUE (email)
)
ENGINE=InnoDB DEFAULT CHARSET=cp1251;
Sanprof
Дата: 26.12.2012 13:34:44
осталось разобраться с
Sanprof
обственно в этой таблице не должно быть двух и более записей имеющих id_parent = NULL, тоесть должна быть только одна запись имеющая id_parent равным NULL, но id_parent не NULL может иметь одинаковое значение для нескольких записей.
Sanprof
Дата: 26.12.2012 14:02:40
CREATE UNIQUE INDEX u_admins_id_parent_is_null ON admins(id_parent) WHERE id_parent IS NULL;

пишет ошибка рядом с "WHERE id_parent IS NULL;"
Akina
Дата: 26.12.2012 14:05:23
В принципе задача логически нерешаема и требует вмешательства оператора.

Вот сделал ты триггер - если удаляется запись, то парентами её подчинённых становится её парент... и что сделает такой триггер, если удалить корневого админа, имеющего несколько подчинённых? правильно, несколько рутов... программно же ты это можешь скорректировать лишь в двух вариантах - назначить одного случайно и подчинить ему остальных, либо запретить удаление. Первый вариант явно бардачный, второй же делает рута пожизненным рутом...

Заданное условие (строго один Null и возможность дублирования любых других значений) в рамках констрейнта не решается. думаю, есть смысл при такой заморочке просто перенести логику корректировки таблицы админов с запроса в процедуру. А там... твори что хочешь.
Sanprof
Дата: 26.12.2012 14:18:49
просто я являюсь суперадмином сайта фирмы, а у нас есть администратор самой фирмы и он на 100% захочет добавить себя как суперадмин через phpMyAdmin обычным запросом. Меня он не удалит, т.к. это приведет к удалению всех остальных админов.
Sanprof
Дата: 26.12.2012 14:24:28
сайт просто так работает, что должен быть только один суперадмин, но наш администратор этого не поймет.
Sanprof
Дата: 26.12.2012 15:06:40
ну так что никак нельзя ограничить?