1.機能
CREATE FUNCTION f_name(paramters) returns dataType; return value;
パラメータはでのみ入力できます。入力パラメータパラメータ名タイプに
は戻り値が必要です。開始リターン
と終了
リターンは追加できません。戻り値タイプはここでは追加されません。
リターンは返される値です。
例:2つの数値を追加します。
create function addfuntion(a int,b int)
returns int return a + b;
#执行函数
select addfuntion(1,1);
注:この
関数は1つの値のみを返すことができます。この
関数は通常、データの追加、削除、変更、およびチェックを含みません。これは一般的な関数です。
カスタム関数の呼び出しは、呼び出し元のシステムと一貫性があります。呼び出しは必要ありません。selectを使用して戻り値を取得します
。関数でSQLステートメント
を使用することはできません。
count()、sum()、avg()、max()、min()など、javaで認識できないSQLステートメントと同じです。
2.事務
トランザクションは、同時に成功または失敗する分割できないユニットのグループです
。トランザクションの前後のデータの整合性は一貫している必要があります。
複数のユーザーが同時にデータにアクセスする場合、1人のユーザーのトランザクションが他のユーザーのトランザクションによって妨害されることはありません。複数の同時トランザクション間のデータは、互いに分離する必要があります。
送信されたものは、データへの変更が永続的であり、データベースに障害が発生した場合でも、影響を与えることはありません。
MySQLでは、Innodbデータベースエンジンを使用するデータベースまたはテーブルのみがトランザクションをサポートします。BEGIN
、ROLLBACK、COMMITを使用して、BEGIN
がトランザクションを開始することを実現し
ます。ROLLBACKトランザクションロールバック
COMMITトランザクションの確認
pythonの例:
import pymysql
try:
conn = pymysql.connect(host="ip",user="user",password="password",db="test1")
print("连接服务器成功!")
cursor = conn.cursor()
sql = "update student set name = \"jack2\" where s_id = 2 ;"
sql2 = "update student set name = rose21 where s_id = 3;" # money打错了将导致执行失败
try:
cursor.execute(sql)
cursor.execute(sql2)
conn.commit()
print("执行成功 提交")
except:
print("发送错误 回滚..")
conn.rollback()
except Exception as e:
print("连接服务器失败.....")
print(type(e),e)
finally:
if cursor:cursor.close()
if conn:conn.close()
スリービュー
ビューを使用して、データのアクセス許可を制御したり、接続クエリを簡素化したりできます。ビューへの追加、削除、変更は元のテーブルに同期されますが、ビューは通常フィールドの一部であるため、通常は失敗します。
ビューは仮想テーブルであるため、使用法は通常と同じです。テーブルは何の違いもありません
ビューを作成して、データフィールドのアクセス許可を制御したり、複数のテーブルのクエリステートメントを簡略化したりします
CREATE VIEW car_location (车架号,layer,地区) as
SELECT
vehicle_purchase_invoice.frame_num,vehicle_purchase_invoice.layer,sys_location.name
from vehicle_purchase_invoice,sys_location
WHERE vehicle_purchase_invoice.layer = sys_location.layer;
#查看视图
SELECT * from car_location WHERE 车架号 ='20B0062R9Y2548197';
#删除视图
DROP VIEW car_location;
第四に、トリガー
1.データを準備します
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
2.エラーログテーブル
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
3.トリガーを作成します
delimiter //
create trigger trigger1 after insert on cmd for each row
FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次。
begin
if new.success = "no" then
insert into errlog values(null,new.cmd,new.sub_time);
end if;
end//
delimiter ;
DROP trigger trigger1;
4.テーブルcmdにレコードを挿入し、トリガーをトリガーして、IFの条件に従ってエラーログを挿入するかどうかを決定します。
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('egon','0755','ls -l /etc',NOW(),'yes'),
('egon','0755','cat /etc/passwd',NOW(),'no'),
('egon','0755','useradd xxx',NOW(),'no'),
('egon','0755','ps aux',NOW(),'yes');
5.エラーログテーブルのレコードが自動的に挿入されるかどうかを確認します
select *from errlog;