Определение непосредственных отношений в SQL Server

Нет никакого стандартного способа сделать это (так же, как нет никакого стандартного способа создать идентификаторы автопостепенного увеличения). Вот два способа сделать это в 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 и также удобна для возврата любого вида расчетного значения по умолчанию.

33
задан André Hauptfleisch 9 March 2011 в 06:26
поделиться

4 ответа

Один к одному на самом деле часто используется в отношениях супертип / подтип. В дочерней таблице первичный ключ также служит внешним ключом для родительской таблицы. Вот пример:

org_model_00

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
76
ответ дан 27 November 2019 в 17:49
поделиться

Почему бы не сделать внешний ключ каждой таблицы уникальным?

3
ответ дан 27 November 2019 в 17:49
поделиться

не существует такой вещи, как явное взаимно-однозначное отношение.

Но из-за того, что tbl1.id и tbl2.id являются первичными ключами а tbl2.id - это внешний ключ, ссылающийся на tbl1.id, вы создали неявное отношение 1: 0..1.

2
ответ дан 27 November 2019 в 17:49
поделиться

Поместите связанные элементы 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, вы можете получить выгоду от вертикального разделения, как вы описали, потому что вы будете делать меньше операций ввода-вывода на диск для сканирования базовой таблицы.

1
ответ дан 27 November 2019 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: