2016-02-28 177 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

該約束將檢查電子郵件列是否以​​結尾。

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

注1:不是檢查類型是在CHECK約束適當的更好,做一個表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 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 
) 
相關問題