2017-01-10 7 views
0

У меня есть таблица с хромосомами (объекты с длиной) и таблица с областями (например, гены) на хромосомах (объекты с диапазоном, определяемым как два целых числа - начало позиции и позиция). Я бы хотел запретить вставку в области базы данных с координатами, превышающими длину конкретной хромосомы.Ограничение SQLite Ограничение CHECK

Возможно ли это в SQLite? Если это невозможно в любой другой системе SQL (желательно бесплатно)?

DROP TABLE IF EXISTS chromosomes; 
CREATE TABLE chromosomes 
    (
    chromosome_id INTEGER UNIQUE NOT NULL CHECK(TYPEOF(chromosome_id) = 'integer'), 
    name   VARCHAR UNIQUE NOT NULL CHECK(TYPEOF(name) = 'text'), 
    length  INTEGER NOT NULL CHECK(TYPEOF(length) = 'integer' AND length > 0), 
    PRIMARY KEY (chromosome_id) 
); 


DROP TABLE IF EXISTS genes; 
CREATE TABLE genes 
    (
    gene_id   INTEGER UNIQUE NOT NULL CHECK(TYPEOF(gene_id) = 'integer'), 
    symbol   VARCHAR NOT NULL CHECK(TYPEOF(symbol) = 'text'), 
    refseq_id   VARCHAR NOT NULL CHECK(TYPEOF(refseq_id) = 'text'), 
    chromosome_id  INTEGER NOT NULL CHECK(TYPEOF(chromosome_id) = 'integer'), 
    start    INTEGER NOT NULL CHECK(TYPEOF(start) = 'integer' AND start > 0 AND start < end), 
    end    INTEGER NOT NULL CHECK(TYPEOF(end) = 'integer' AND end > 0 AND end > start), 
    external_db_link VARCHAR NOT NULL CHECK(TYPEOF(external_db_link) = 'text'), 
    PRIMARY KEY (gene_id)     
    FOREIGN KEY (chromosome_id) REFERENCES chromosomes(chromosome_id) 
); 
+0

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

+0

sqlite имеет ограничения. И, возможно, неплохо сделать проверку типа, как вы делаете, потому что sqlite не использует другие разумные типы принудительного применения! – e4c5

+0

В Postgres вы можете определить ограничения исключения для типов диапазонов. Не уверен, что это сработает здесь (я ничего не знаю о представлении хромосом). Можете ли вы изменить свой вопрос и добавить некоторые примеры данных и как это ограничение должно применяться к этому? В Postgres вам не нужны такие вещи, как 'CHECK (TYPEOF (length) = 'integer'') –

ответ

1

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

Триггеры доступны в SQLite, а также в других базах данных.

Один рабочий ход - это контрольное ограничение с использованием пользовательской функции. Функция может выполнять поиск в таблице chromosomes и использоваться в ограничении check. SQLite не имеет пользовательских функций. Одна база данных, поддерживающая это, - Postgres.

Другой вариант - обернуть все изменения данных в хранимых процедурах (это, как правило, так, как я проектирую системы). Затем хранимая процедура может выполнять все проверки, которые необходимы.

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