2016-02-28 12 views
-2

Я новичок в программировании sql. Это для домашнего задания для моего класса базы данных. Я сделал всю таблицу, которая мне нужна для задания, я просто повесил одну часть. Строка в выполнении домашних заданий гласит:Адрес электронной почты клиента

Если тип «факультет» адрес электронной почты должен закончить с «@ xxx.edu»

Это то, что таблица выглядит следующим образом:

create table customer 
(
CID# char(10) primary key IDENTITY (1,1) NOT NULL, 
F_name varchar(20), 
M_name varchar(20), 
L_name varchar(20), 
type varchar(20), 
street varchar(20), 
city varchar(20), 
state varchar(20), 
zip char(5), 
password varchar (20) NOT NULL, 
email varchar(20) NOT NULL 
Constraint CK_customer_type check (type in ('student', 'faculty')) 
) 

Любая помощь, которую кто-то может предоставить, будет очень признательна!

+0

Что ваш вопрос? –

+0

Что конкретно вам нужно? –

+0

Я думаю, что вопрос: как поставить ограничение на столбец адрес электронной почты? – Alexei

ответ

1

Это ограничение будет проверять, заканчивается ли столбец электронной почты @xxx.edu.

Constraint CK_email_faculty check (
    type<>'faculty' OR 
    CHARINDEX('@xxx.edu',email)=LEN(email)-LEN('@xxx.edu')+1 
) 

Примечание 1: Лучше, чем проверки типа будучи уместна в проверочном ограничении, сделать таблицу customer_type с возможными типами («студент», «факультет» ...), и имеют внешний ключ в customer указывая тип.

CREATE TABLE customer_type(id INT NOT NULL PRIMARY KEY,desc VARCHAR(128)); 
INSERT INTO customer_type(id,desc)VALUES(1,'student'); 
INSERT INTO customer_type(id,desc)VALUES(2,'faculty'); 

Есть внешний ключ в вашем customer таблице, чтобы указать на customer_type таблице:

CREATE TABLE customer(
    -- ... 
    type INT NOT NULL, 
    -- ... 
    CONSTRAINT FK_type_customer_type FOREIGN KEY(type) REFERENCES customer_type(id) 
) 

Вы бы тогда не вставить описание типа, но идентификатор типа:

INSERT INTO customer(...,type,...)VALUES(...,1,...); -- for student 
INSERT INTO customer(...,type,...)VALUES(...,3,...); -- fails, type doesn't exist 

Это способ сохранения дискового пространства и памяти, когда эти таблицы кэшируются SQL Server.


Замечание 2: Ширины ваших полей varchar очень маленькие. Адрес электронной почты всего 20 символов?

0

Добавить Constraint

Constraint CK_email check (email like case when type in ('faculty') then '%@xxx.edu' else email end) 
1

Для вашего конкретного случая ограничение, как это может быть в порядке:

Constraint CK_customer_email check (
    type <> 'faculty' OR 
    email LIKE '%_%@_%.edu' 
    CHARINDEX('@xxx.edu',email)=LEN(email)-LEN('@xxx.edu')+1 
) 

Это позволит 1+, за которыми следует @, за которыми следуют 1+ символов, а затем по .edu.

Однако в реальной жизни (когда люди пытаются вставить плохие адреса электронной почты), validation is more complex (не все символы разрешены), поэтому можно использовать пользовательскую функцию. Тот, кажется, почти полная обеспечивается here:

CREATE FUNCTION [dbo].[fnAppEmailCheck](@email VARCHAR(255)) 
--Returns true if the string is a valid email address. 
RETURNS bit 
as 
BEGIN 
    DECLARE @valid bit 
    IF @email IS NOT NULL 
      SET @email = LOWER(@email) 
      SET @valid = 0 
      IF @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z][a-z]%' 
      AND LEN(@email) = LEN(dbo.fnAppStripNonEmail(@email)) 
      AND @email NOT like '%@%@%' 
      AND CHARINDEX('[email protected]',@email) = 0 
      AND CHARINDEX('..',@email) = 0 
      AND CHARINDEX(',',@email) = 0 
      AND RIGHT(@email,1) between 'a' AND 'z' 
       SET @valid=1 
    RETURN @valid 
END 

Тогда ваше ограничение будет выглядеть так:

Constraint CK_customer_email check (
    type <> 'faculty' OR 
    [dbo].[fnAppEmailCheck] (email) = 1 
) 
Смежные вопросы