2016-08-07 4 views
0

У меня есть две таблицы SQL ctgl_geometry и ctgl_verticesВставка данных с помощью внешнего ключа SQL

ctgl_geometry будет хранить геометрию как точки соединены друг с другом, поэтому он имеет идентификатор, одно значение, число вершин и внешний ключ, чтобы связать идентификатор, чтобы получить список значений этой геометрии

CREATE TABLE ctgl_geometry (
    Id     int primary key, 
    otherVal    int, 
    NoVertices   int, 
    vertexID    int 
); 
create table ctgl_vertices 
(
    Id   int primary key, 
    GeometryId int, 
    val  int 
); 

, например, если имеется список вершин {0,1,6,5,4} из длины 5 я хранить его вершины таблицы как

INSERT INTO ctgl_vertices VALUES 
(1,101,0), 
(2,101,1), 
(3,101,6), 
(4,101,5), 
(5,101,4); 

и в геометрии, как:

INSERT INTO ctgl_geometry VALUES 
(1, 10,5,101); 

ссылка, чтобы узнать список.

Но я не знаю, как сохранить значения, если я не знаю значение идентификатора (101 в примере)

Так я думал об использовании IDENT_CURRENT, чтобы узнать последние вставленные вершины табличное значение, как:

SELECT IDENT_CURRENT('ctgl_vertices ') + IDENT_INCR('ctgl_vertices '); 

и результат присвоить его внешний ключ ctgl_geometryvertexID

Но я думаю, что будет лучший способ сделать это .. .

Как вставить список вершин, а затем присвоить значение геометрии?

Я также использую этот запрос для получения значений:

select g.NoVertices,v.val from ctgl_geometry g 
     inner join ctgl_vertices v 
on g.vertexID = v.GeometryId where g.otherVal = 10; 

и получить

NoVertices val 
5 0 
5 1 
5 6 
5 5 
5 4 
4 1 
4 2 
4 7 
4 6 
4 2 
4 3 
4 8 
4 7 
4 4 
4 5 
4 10 
4 9 
4 5 
4 6 
4 11 
4 10 
4 6 
4 7 
4 12 
4 11 
4 7 
4 8 
4 13 
4 12 

Please take a look at fiddle

+0

В каких столбцах находятся столбцы Identity в ваших таблицах? Также вы не определили ограничения внешнего ключа в схемах таблиц? –

+0

Не уверен, что я понял, но похоже, что ваш ** 101 ** является 'vertexID' в первой таблице и' GeometryId' в другом. –

+0

да, на самом деле хотелось бы, чтобы некоторые помогли переопределить схему и вставить запросы ... – Edgar

ответ

1

Вы Таблица схемы необходим серьезное внимание. Вы логически определяете внешние отношения в своей голове, но фактически не реализуете их.

В вашей ссылочной колонке должно быть определено ограничение на внешний ключ, в вашем случае это GeometryId.

И колонна ссылка должна быть столбец первичного ключа, который в вашем случае будет vertexID

Принимая эти рекомендации во внимание вы схема таблицы должны быть чем-то вроде ....

CREATE TABLE ctgl_geometry (
    Id     int , 
    otherVal    int, 
    NoVertices   int, 
    vertexID    int IDENTITY(1,1) NOT NULL primary key 
); 
GO 
create table ctgl_vertices 
(
    Id   int primary key, 
    GeometryId int REFERENCES ctgl_geometry(vertexID), 
    val  int 
); 
GO 

сейчас как только вы логически исправили схемы таблиц, вы будете использовать SCOPE_IDENTITY(), чтобы получить последнее значение идентификации, сгенерированное столбцом идентификации в таблице ctgl_geometry, и использовать это значение для вставки строк в таблицу ctgl_vertices.

Что-то вроде ......

Declare @NewID INT; 

INSERT INTO ctgl_geometry (Id , otherVal, NoVertices) 
VALUES (1, 10,5); 

SET @NewID = SCOPE_IDENTITY(); 


INSERT INTO ctgl_vertices (Id, GeometryId ,Val) 
VALUES 
    (1,@NewID,0), 
    (2,@NewID,1), 
    (3,@NewID,6), 
    (4,@NewID,5), 
    (5,@NewID,4); 
+0

и как бы запрос 'select g.NoVertices, v.val из ctgl_geometry g внутреннее соединение ctgl_vertices v на g.vertexID = v.GeometryId где g .otherVal = 10; ', который возвращает значения, изменится? – Edgar

Смежные вопросы