Вы можете использовать оконные функции. Логика будет такой:
select principal, apellido, nombre
from (select t.*, count(*) over (partition by principal) as cnt
from t
) t
where cnt = 1;
Это вернет строки, где principal
равно NULL
; такие строки исключены в NOT EXISTS
.
Однако, самый быстрый метод, если у вас есть первичный ключ и индекс на (principal, pk)
, это, вероятно,:
select principal, apellido, nombre
from t
where not exists (select 1
from t t2
where t2.principal = t.principal and t2.pk <> t.pk
);
Я предложу иметь уникальный ключ для платежной таблицы. На он - сторона, внешний ключ не должен быть auto_increment, поскольку это относится к уже существующему ключу.
CREATE TABLE GUEST(
id int(15) not null auto_increment PRIMARY KEY,
GuestName char(25) not null
) ENGINE=INNODB;
CREATE TABLE PAYMENT(
id int(15)not null auto_increment,
Guest_id int(15) not null,
INDEX G_id (Guest_id),
Foreign Key(Guest_id) references GUEST(id),
BillNr int(15) not null
) ENGINE=INNODB;
Удостоверьтесь, что Вы используете механизм InnoDB или для базы данных, или для обеих таблиц. От MySQL Reference:
Для механизмов устройства хранения данных кроме InnoDB MySQL Server анализирует синтаксис FOREIGN KEY в операторах CREATE TABLE, но не использует или хранит его.
Ответ на Ваш вопрос является почти тем же как ответом этому.
Необходимо указать в таблице, содержащей внешний ключ название таблицы, содержащей первичный ключ и название поля первичного ключа (использующий "ссылки").
Это имеет некоторый код, показывающий, как создать внешние ключи собой, и в CREATE TABLE.
Вот один из более простых примеров от этого:
CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE CASCADE
) ENGINE=INNODB;