2017-08-19 81 views
0

我为客户域维护编写了以下脚本。我想在表中修改脚本。如果状态是活动的,我想设置唯一的约束到端口字段。如果状态是无效的,我不想唯一约束。我可以根据其他列值来设置这个约束吗?请帮帮我..!我如何设置基于其他列值的唯一约束

#!/bin/bash 

echo " --- Enter the Database name ---" #name of the database 
read databasename 

echo " --- enter the table name --- " #name of the table 
read table_name 

sqlite3 $databasename.db "DROP TABLE IF EXISTS $table_name;" 

sqlite3 $databasename.db "CREATE TABLE IF NOT EXISTS $table_name(cus_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,cus_name TEXT NOT NULL UNIQUE ,cus_domain TEXT UNIQUE,Created_on default CURRENT_DATE,cus_status TEXT NOT NULL,Port INTEGER NOT NULL);" #table creation 


echo " --- Enter the total number of customer records do you want ---" 
read cus_count # number of rows value 


echo "--- Enter the following details one by one---" 

RED='\033[0;31m' 
NC='\033[0m' 
port_num=8080 
declare -a customer 

for((i=1;i<=cus_count;i++)) 
do 


echo "enter the $i customer details" 

echo "---Enter the customer name---" 
read c_name 

d_name=${c_name,,} 
#echo $d_name 

customer=$(sqlite3 $databasename.db "select cus_domain from $table_name where cus_domain like '$d_name';") 

for cus in "${customer[@]}" 
do 

if [[ $d_name != $customer ]]; 

then 
    echo "---Enter the Status(Active/Inactive)---" 
    read c_status 

if [[ "$port_num" == "$port_num" ]]; then 
     port_num=$(($port_num + 1)) 

c_domain="$c_name" 


sqlite3 $databasename.db "INSERT OR IGNORE INTO $table_name (cus_name,cus_domain,cus_status, Port) VALUES(\"$c_name\",\"${c_domain,,}\",\"${c_status,,}\",\"$port_num\") ;" 
fi 


else 
    echo -e "${RED}!!!OOPS for you entered customer name already domain name assigned!!!${NC}" 
    echo -e "${RED}Please enter new customer name${NC}" 

i=$(($i - 1)) 

fi 
done 
done 

echo " --- Records from the $table_name ---" 

sqlite3 $databasename.db "select * from $table_name;" 
+0

所以,你想做一些改变,没有一个独特的限制阻碍。然后你想开始使用唯一的约束。如果违反约束条件,你希望发生什么?如果这不可能发生,那么为什么你想暂时禁用约束? – Yunnosch

+0

对于新进入的客户详细信息,我使用非活动状态端口号,所以只有我想要它。 @Yunnosch – Mahendranatarajan

回答

1

使用partial index

的局部索引定义可以包括UNIQUE关键字。如果是这样,那么SQLite需要索引中的每个条目都是唯一的。这提供了一种机制来强制跨表中某些行的子集进行唯一性。

CREATE UNIQUE INDEX i ON MyTable(Port) WHERE cus_status = 'Active'; 
+0

在我的表中,我已经有了以下数据。 – Mahendranatarajan

+0

1 | Ajax | ajax | 2017-08-19 | active | 8062 2 | VVCOE | vvcoe | 2017-08-19 | inactive | 8063 – Mahendranatarajan

+0

然后我给出以下输入 – Mahendranatarajan