我创建了一个包含五列的表:
userID,name,mobile_num,telphone_num,count
必须填写移动电话或电话号码或两个字段,并且它应该是唯一的。我如何在mysql中创建这样的行?
答案 0 :(得分:0)
CREATE TABLE information (
userID INT NOT NULL,
name varchar(255),
mobile_num INT UNIQUE,
telphone_num INT UNIQUE,
count INT,
PRIMARY KEY (userID)
)
UNIQUE
属性强制值是唯一的,但这对您来说可能是一个问题,因为如果两个用户 GIVE 您的移动设备,但 DONT GIVE 不是他们的家庭电话,你不能让两个用户的值为NULL,所以我认为你要求的解决方案可能不是你最好的选择。
答案 1 :(得分:0)
执行此操作的最简单方法是在应用程序代码中强制执行向数据库插入行的要求。
This question表明不可能通过表约束强制执行两列中的一列。
您可以创建一个后插入trigger来检查需求,但假设数据库在您的应用程序的控制之下,只需在应用程序中强制执行此要求是最有意义的。编码和错误处理将更简单。
当你说电话号码"必须是唯一的时候,你不清楚你的意思"但我可能会重新考虑这个要求。
两个用户可能位于同一位置(例如同一家庭)并拥有相同的电话号码。因此用户之间可能存在重复的电话号码。
< / LI>使用手机号码作为主要手机的用户可能会在这两个字段中输入相同的电话号码。我没有看到任何阻止这种情况的好处。实际上,当发生这种情况时,您获得的信息比您预防的信息更多。并且试图阻止它可能会导致数据输入界面让用户感到困惑。
答案 2 :(得分:0)
CREATE TABLE information (
userID INT NOT NULL,
name varchar(255),
mobile_num INT,
telphone_num INT,
count INT,
PRIMARY KEY (userID,mobile_num,telephone_num)
)
面对情况时,请使用以下查询插入任意一个数字
insert into information(UserID,name,mobile_num,count)
values(3,'andrew',23443546,5);
或
insert into information(UserID,name,phone_num,count)
values(3,'andrew',23443546,5);
默认情况下,mysql会在这种情况下将其他数字的值插入为0,
因此,当您要使用
仅插入一个数字时,可以将0用于其他数字insert into information
values(3,'andrew',0,23443546,5);
insert into information
values(3,'andrew',23443546,0,5);
答案 3 :(得分:0)
您可以使用触发器:
DELIMITER //
CREATE TRIGGER checkPhoneNumbers
BEFORE INSERT ON tableName
FOR EACH ROW
BEGIN
SET @exists = (SELECT *
FROM tableName
WHERE mobile_num = NEW.mobile_num
|| mobile_num = NEW.telphone_num
|| telphone_num = NEW.telphone_num
|| telphone_num = NEW.telphone_num);
IF(@exists IS NOT NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Telephone or mobile number already present!';
END IF;
END
//
DELIMITER ;
通过这种方式,如果您插入已作为移动电话或电话号码存在的移动电话或电话号码,您将遇到数据库错误