Нет никакого стандартного способа сделать это (так же, как нет никакого стандартного способа создать идентификаторы автопостепенного увеличения). Вот два способа сделать это в PostgreSQL. Предположите, что это - Ваша таблица:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
lastname VARCHAR NOT NULL,
firstname VARCHAR
);
можно сделать это в двух операторах, пока они - последовательные операторы в том же соединении (это будет безопасно в PHP с организацией пула подключений, потому что PHP не отдает соединение с пулом, пока сценарий не сделан):
INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George');
SELECT lastval();
lastval () дает Вам последнее автоматически сгенерированное значение последовательности, используемое в текущем соединении.
другой путь состоит в том, чтобы использовать PostgreSQL ВОЗВРАТ , пункт на ВСТАВЛЯЕТ оператор:
INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;
Эта форма возвращает набор результатов точно так же, как оператор SELECT и также удобна для возврата любого вида расчетного значения по умолчанию.
Один к одному на самом деле часто используется в отношениях супертип / подтип. В дочерней таблице первичный ключ также служит внешним ключом для родительской таблицы. Вот пример:
CREATE TABLE Organization
(
ID int PRIMARY KEY,
Name varchar(200),
Address varchar(200),
Phone varchar(12)
)
GO
CREATE TABLE Customer
(
ID int PRIMARY KEY,
AccountManager varchar(100)
)
GO
ALTER TABLE Customer
ADD FOREIGN KEY (ID) REFERENCES Organization(ID)
ON DELETE CASCADE
ON UPDATE CASCADE
GO
Почему бы не сделать внешний ключ каждой таблицы уникальным?
не существует такой вещи, как явное взаимно-однозначное отношение.
Но из-за того, что tbl1.id и tbl2.id являются первичными ключами а tbl2.id - это внешний ключ, ссылающийся на tbl1.id, вы создали неявное отношение 1: 0..1.
Поместите связанные элементы 1: 1 в одну строку той же таблицы. Вот откуда происходит «отношение» в «реляционной базе данных» - связанные вещи помещаются в одну и ту же строку.
Если вы хотите уменьшить размер данных, передаваемых по сети, рассмотрите возможность проецирования только необходимых столбцов:
SELECT c1, c2, c3 FROM t1
или создания представление, которое проецирует только соответствующие столбцы и использует это представление при необходимости:
CREATE VIEW V1 AS SELECT c1, c2, c3 FROM t1
SELECT * FROM t1
UPDATE v1 SET c1=5 WHERE c2=7
Обратите внимание, что большие двоичные объекты хранятся вне строк в SQL Server, поэтому вы не экономите много операций ввода-вывода на диске за счет вертикального разделения данных. Если это были столбцы, отличные от BLOB, вы можете получить выгоду от вертикального разделения, как вы описали, потому что вы будете делать меньше операций ввода-вывода на диск для сканирования базовой таблицы.