programing

요소를 제거하지 않고 세트에서 요소를 가져오려면 어떻게 해야 합니까?MySQL 용어 "제약"과 "외부 키"의 차이점

minecode 2022. 12. 30. 17:18
반응형

요소를 제거하지 않고 세트에서 요소를 가져오려면 어떻게 해야 합니까?

다음과 같이 가정합니다.

>>> s = set([1, 2, 3])

「( 「」)」로부터임의의 값하려면 , 어떻게 요.s 않고s.pop()할 수 할 수 제거할 수 있을 때까지 항목을 세트에 남겨두고 싶습니다. 다른 호스트에 대한 비동기 호출 후에만 확인할 수 있습니다.

빠르고 지저분함

>>> elem = s.pop()
>>> s.add(elem)

하지만 더 나은 방법을 알고 있나요?이상적으로는 일정한 시간 안에.

전체 세트를 복사할 필요가 없는 두 가지 옵션:

for e in s:
    break
# e is now an element from s

아니면...

e = next(iter(s))

그러나 일반적으로 세트는 인덱싱이나 슬라이싱을 지원하지 않습니다.

최소 코드는 다음과 같습니다.

>>> s = set([1, 2, 3])
>>> list(s)[0]
1

물론 이렇게 하면 세트의 각 멤버가 포함된 새 목록이 생성되므로 세트가 매우 크면 좋지 않습니다.

세트별로 어떤 기능이 발휘될지 궁금해서 벤치마크를 해봤습니다.

from random import sample

def ForLoop(s):
    for e in s:
        break
    return e

def IterNext(s):
    return next(iter(s))

def ListIndex(s):
    return list(s)[0]

def PopAdd(s):
    e = s.pop()
    s.add(e)
    return e

def RandomSample(s):
    return sample(s, 1)

def SetUnpacking(s):
    e, *_ = s
    return e

from simple_benchmark import benchmark

b = benchmark([ForLoop, IterNext, ListIndex, PopAdd, RandomSample, SetUnpacking],
              {2**i: set(range(2**i)) for i in range(1, 20)},
              argument_name='set size',
              function_aliases={first: 'First'})

b.plot()

여기에 이미지 설명 입력

은 몇 접근법접근법)을 .RandomSample,SetUnpacking ★★★★★★★★★★★★★★★★★」ListIndex)는 세트의 크기에 따라 다르며 일반적인 경우에는 피해야 합니다(최소한 퍼포먼스가 중요한 경우).이미 다른 답변에서 알 수 있듯이 가장 빠른 방법은ForLoop.

그러나 일정한 시간 접근 방식 중 하나를 사용하는 한 성능 차이는 무시할 수 있습니다.


iteration_utilities (면책자:I'm author)에는 이 사용 사례에 대한 편의 기능이 포함되어 있습니다.

>>> from iteration_utilities import first
>>> first({1,2,3,4})
1

위의 벤치마크에도 포함시켰습니다.다른 2개의 "빠른" 솔루션과 경쟁할 수 있지만 어느 쪽이든 큰 차이는 없습니다.

dr;dr

for first_item in muh_set: breakPython 3.x에서는 최적의 접근 방식을 유지합니다.

너는 이렇게 해

wr.뛰어난 Python 2.x 고유응답으로부터 추정된 또 다른 Python 3.x 타이밍 세트에 오신 것을 환영합니다.마찬가지도움이 되는 Python 3.x의 응답과는 달리, 아래의 타이밍은 위에서 제안한 이상형 솔루션에도 해당합니다.

위대한 기쁨을 위한 코드 조각

켜고, 보고, 시간을 재세요:

from timeit import Timer

stats = [
    "for i in range(1000): \n\tfor x in s: \n\t\tbreak",
    "for i in range(1000): next(iter(s))",
    "for i in range(1000): s.add(s.pop())",
    "for i in range(1000): list(s)[0]",
    "for i in range(1000): random.sample(s, 1)",
]

for stat in stats:
    t = Timer(stat, setup="import random\ns=set(range(100))")
    try:
        print("Time for %s:\t %f"%(stat, t.timeit(number=1000)))
    except:
        t.print_exc()

타임리스 타이밍의 신속한 폐지

보세요! 가장 빠른 조각과 가장 느린 조각 순서로 정렬됩니다.

$ ./test_get.py
Time for for i in range(1000): 
    for x in s: 
        break:   0.249871
Time for for i in range(1000): next(iter(s)):    0.526266
Time for for i in range(1000): s.add(s.pop()):   0.658832
Time for for i in range(1000): list(s)[0]:   4.117106
Time for for i in range(1000): random.sample(s, 1):  21.851104

온 가족을 위한 화초

물론 수동 반복은 두 번째로 빠른 솔루션보다 최소 두 배 이상 빠릅니다.Bad Old Python 2.x days(수동 반복이 최소 4배 빠름)보다 격차가 줄었지만, 가장 장황한 솔루션이 최선이라는 PEP 20 광신도들을 실망시켰다.적어도 집합의 첫 번째 요소를 추출하기 위해 집합을 목록으로 변환하는 것은 예상만큼 끔찍하다.구이도에게 감사드리며, 그의 빛이 우리를 계속 우리를 인도하길 바랍니다.

놀랍게도 RNG 기반 솔루션은 정말 끔찍합니다.목록 변환이 잘못되었지만random 끔찍한 케익을 가져가죠.난수신은 이제 끝이야

난 그저 비정질적인 사람들이 PEP를 해주길 바랄 뿐이야set.get_first()방법을 알고 있습니다.이 글을 읽고 있다면, "제발"어떻게 좀 해봐.

다양한 접근법의 배후에 있는 타이밍 수치를 제공하려면 다음 코드를 고려하십시오.get()은 Python의 setobject.c에 추가한 커스텀으로 요소를 삭제하지 않고 pop()에 불과합니다.

from timeit import *

stats = ["for i in xrange(1000): iter(s).next()   ",
         "for i in xrange(1000): \n\tfor x in s: \n\t\tbreak",
         "for i in xrange(1000): s.add(s.pop())   ",
         "for i in xrange(1000): s.get()          "]

for stat in stats:
    t = Timer(stat, setup="s=set(range(100))")
    try:
        print "Time for %s:\t %f"%(stat, t.timeit(number=1000))
    except:
        t.print_exc()

출력은 다음과 같습니다.

$ ./test_get.py
Time for for i in xrange(1000): iter(s).next()   :       0.433080
Time for for i in xrange(1000):
        for x in s:
                break:   0.148695
Time for for i in xrange(1000): s.add(s.pop())   :       0.317418
Time for for i in xrange(1000): s.get()          :       0.146673

즉, for/break 솔루션이 가장 빠릅니다(때로는 커스텀 get() 솔루션보다 빠를 수 있습니다).

랜덤 요소가 필요하기 때문에, 이것 또한 동작합니다.

>>> import random
>>> s = set([1,2,3])
>>> random.sample(s, 1)
[2]

이 문서에서는 퍼포먼스에 대해서는 언급하지 않은 것 같습니다.random.sample방대한 리스트와 방대한 세트를 포함한 매우 빠른 실증 테스트로부터, 리스트는 일정한 시간이지만, 세트에는 일정하지 않은 것 같습니다.또한 집합에 대한 반복은 랜덤이 아닙니다. 순서는 정의되지 않지만 예측 가능합니다.

>>> list(set(range(10))) == range(10)
True 

랜덤성이 중요하며 일정 시간 내에 여러 요소가 필요한 경우(큰 집합)random.sample먼저 목록으로 변환합니다.

>>> lst = list(s) # once, O(len(s))?
...
>>> e = random.sample(lst, 1)[0] # constant time

세트 요소를 얻는 방법은 매우 느리지만 가장 콤팩트한(6개의 기호) 것 같습니다(PE 3132에 의해 가능).

e,*_=s

Python 3.5+에서는 PEP 448 덕분에 다음과 같은 7심볼 식을 사용할 수 있습니다.

[*s][0]

두 옵션 모두 for-loop 방식보다 기계 속도가 약 1000배 느립니다.

Python 3의 또 다른 방법:

next(iter(s))

또는

s.__iter__().__next__()

저는 제가 쓴 유틸리티 함수를 사용합니다.그 이름은 다소 오해의 소지가 있습니다. 왜냐하면 그것은 그것이 무작위적인 물건일 수도 있고 그런 것일 수도 있기 때문입니다.

def anyitem(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

Following@wr.post, Python 3.5에 대해서도 비슷한 결과를 얻을 수 있습니다.

from timeit import *

stats = ["for i in range(1000): next(iter(s))",
         "for i in range(1000): \n\tfor x in s: \n\t\tbreak",
         "for i in range(1000): s.add(s.pop())"]

for stat in stats:
    t = Timer(stat, setup="s=set(range(100000))")
    try:
        print("Time for %s:\t %f"%(stat, t.timeit(number=1000)))
    except:
        t.print_exc()

출력:

Time for for i in range(1000): next(iter(s)):    0.205888
Time for for i in range(1000): 
    for x in s: 
        break:                                   0.083397
Time for for i in range(1000): s.add(s.pop()):   0.226570

단, 기본 세트를 변경하는 경우(예를 들어, 에 대한 호출)remove()반복할 수 있는 예에서는 상황이 좋지 않다( ).for,iter):

from timeit import *

stats = ["while s:\n\ta = next(iter(s))\n\ts.remove(a)",
         "while s:\n\tfor x in s: break\n\ts.remove(x)",
         "while s:\n\tx=s.pop()\n\ts.add(x)\n\ts.remove(x)"]

for stat in stats:
    t = Timer(stat, setup="s=set(range(100000))")
    try:
        print("Time for %s:\t %f"%(stat, t.timeit(number=1000)))
    except:
        t.print_exc()

결과:

Time for while s:
    a = next(iter(s))
    s.remove(a):             2.938494
Time for while s:
    for x in s: break
    s.remove(x):             2.728367
Time for while s:
    x=s.pop()
    s.add(x)
    s.remove(x):             0.030272

소규모 컬렉션에서는 주로 이렇게 파서/컨버터 방식을 만듭니다.

def convertSetToList(setName):
return list(setName)

그러면 새 목록을 사용할 수 있고 색인 번호로 액세스할 수 있습니다.

userFields = convertSetToList(user)
name = request.json[userFields[0]]

리스트에는, 조작에 필요한 그 외의 모든 방법이 기재되어 있습니다.

값을 언팩하여 요소에 액세스할 수 있습니다.

s = set([1, 2, 3])

v1, v2, v3 = s

print(v1,v2,v3)
#1 2 3

첫 번째 요소만 원하시면 b = (a-set().pop()을 사용해 보세요.

는 요?s.copy().pop()시간을 재지는 않았지만 작동해야 하고 간단해요.그러나 전체 세트를 복사하기 때문에 작은 세트에 가장 적합합니다.

다른 옵션은 사용자가 상관하지 않는 값을 가진 사전을 사용하는 것입니다.예.,


poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
...

키는 집합으로 취급할 수 있습니다.단, 배열에 불과합니다.


keys = poor_man_set.keys()
print "Some key = %s" % keys[0]

입니다.set비단뱀최선의 답은 아닐 수도 있지만 다른 선택 사항입니다.

편집: 배열 또는 설정 대신 dict를 사용한 사실을 숨기기 위해 다음과 같은 작업을 수행할 수도 있습니다.


poor_man_set = {}
poor_man_set[1] = None
poor_man_set[2] = None
poor_man_set[3] = None
poor_man_set = poor_man_set.keys()

언급URL : https://stackoverflow.com/questions/59825/how-to-retrieve-an-element-from-a-set-without-removing-it

MySQL 용어 "제약"과 "외부 키"의 차이점

여기 MySQL 문서를 보고 FORENAL KEY와 RESTRAINS의 구분을 확인하려고 합니다.FK가 제약인 줄 알았는데 의사들끼리 서로 별개인 것처럼 얘기하더군요

FK를 작성하기 위한 구문은 (일부)...

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)

따라서 "컨스트레인트" 절은 선택 사항입니다.왜 그것을 포함하거나 포함하지 않는가?생략할 경우 MySQL은 제약조건이 아닌 외부 키를 생성합니까?아니면 "컨스트레인트"가 FK의 이름에 지나지 않기 때문에 지정하지 않으면 익명 FK가 되는 것입니까?

어떤 설명이라도 해주시면 감사하겠습니다.

감사해요.

이단

네, 외부 키는 제약 조건의 한 종류입니다.MySQL은 제약에 대한 지원이 고르지 않습니다.

  • PRIMARY KEY및 열 : 네, 그렇습니다.
  • FOREIGN KEY 및 할 수 있습니다. 않으면 되지만 무시됩니다 테이블 제약으로 사용되지만 InnoDB 및 BDB 스토리지 엔진에서만 사용할 수 있으며, 그렇지 않으면 구문 분석되지만 무시됩니다.
  • CHECK 엔진에서 모든 스토리지 엔진에서 구문 분석되었지만 무시되었습니다.
  • UNIQUE및 열 : 네, 그렇습니다.
  • NOT NULL: 네.
  • DEFERRABLE타타제제 : 지없없없없 。

CONSTRAINT절을 사용하면 제약조건의 이름을 명시적으로 지정하여 메타데이터를 읽기 쉽게 만들거나 제약조건을 폐기할 때 이름을 사용할 수 있습니다.에는 SQL이 합니다.CONSTRAINT절은 옵션입니다.생략하면 RDBMS에 의해 이름이 자동으로 생성되고 이름은 구현에 따라 달라집니다.

일반적으로(필수 MySQL은 아님) 외부 키는 제약 사항이지만 제약 조건이 항상 외부 키인 것은 아닙니다.주요 제약사항, 고유한 제약사항 등을 생각해 보십시오.

구체적인 질문으로 돌아가면, 정답입니다.CONSTRARECT [symbol] 부분을 생략하면 자동 생성된 이름의 FK가 생성됩니다.

현재 CREATE TABLE DDL은 이 형식입니다.사용하고 있는 UNIQURE KEY 및 FORNE KEY 정의 구문에 주목해 주십시오.

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    UNIQUE KEY uk1_my_table(account_nbr, account_name),
    FOREIGN KEY fk1_my_table(vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

단– defined입니다.MySQL uk1_my_table_table fk_table fk_table fk_table 입니다. ★★★★★★★★★★★★★★★★★.ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table이 이름을 가진 FK DB 객체가 없기 때문에 작동하지 않습니다(따라서 답답하고 알람이 발생합니다).

다음은 Constarints 대체 DDL 형식입니다(참조 자료:https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html):-).

CREATE TABLE my_dbschema.my_table (
    id INT unsigned auto_increment PRIMARY KEY,
    account_nbr INT NOT NULL,
    account_name VARCHAR(50) NOT NULL,
    active_flg CHAR(1) NOT NULL DEFAULT 'Y',
    vendor_nbr INT NOT NULL,
    create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
    create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
    last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
    CONSTRAINT uk1_my_table UNIQUE KEY (account_nbr, account_name),
    CONSTRAINT fk1_my_table FOREIGN KEY (vendor_nbr) REFERENCES vendor(vendor_nbr)
    );

되어 있듯이 uk1_my_table fk1_table fk_table입니다.DDL FK1_my_table이다.ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table동작하지만 이름이 같은 인덱스를 남깁니다.

해 주세요.ALTER TABLE my_table DROP INDEX fk1_my_tableFK가 아직 드롭되지 않은 경우 FK에서 사용 중이라는 오류 메시지와 함께 처음에는 작동하지 않습니다.DROP FK의 DROP INDEX.

이것이 혼란을 설명하고 해결하는 데 도움이 되기를 바랍니다.

MySQL에 응답할 수 없지만 FK는 제약 조건입니다.데이터를 특정 상태로 강제하는 것은 모두 제약 조건입니다.여러 종류의 제약이 있으며 Unique, Primary Key, Check 및 Foreign Key가 모두 제약입니다.MySQL에 다른 것이 있을 수 있습니다.

명령어에서는 단어를 사용할 수 있지만 DELETE 스테이트먼트의 FROM과 같이 읽기 쉽도록 필요하지 않을 수 있습니다.

만약 내가 틀리지 않았다면, 제약조건은 인덱스가 필요하기 때문에, 예를 들어 외부 키 제약조건을 작성하면 MySQL도 자동으로 인덱스를 작성합니다.

저는 이 링에 출사표를 던질 것입니다만, 제 답이 정확한지는 잘 모르겠습니다만, 데이터베이스 엔지니어링의 내부 배짱을 알고 있다면 정정해 주세요.하지만 내가 맞다면 이게 도움이 될 것 같아.

자동차 엔진과 크랭크축이 동일하지 않다는 점에서 외부 키와 관련 외부 키 구속조건은 동일하지 않습니다.엔진은 가솔린 폭발을 직선 운동(피스톤)으로 변환하고 크랭크축은 이 직선 운동을 회전 운동으로 변환한 다음 차량의 휠을 회전시킵니다.엔진과 크랭크축이 함께 차를 움직이게 한다.

마찬가지로 Foreign Key와 Foreign Key Constraint는 동일하지 않지만 'Foreign Key Relationship'이라는 개념을 구축하기 위해 서로 협력합니다.

정의:

"Foreign Key"는 Foreign Key Index의 줄임말입니다.

"Constraint"는 Foreign Key Constraint의 줄임말입니다.

인덱스와 제약 조건은 함께 "외부 키 관계"를 만듭니다.

외부 키 관계는 하위 테이블의 값이 상위 테이블에 존재해야 하므로 데이터베이스의 데이터 무결성이 보장됩니다.

Key는 Index를 의미하기 때문에 "Foreign Key Index"라고 하지 않습니다.'외국어 키'라고만 말할 뿐 '색인'이라고 말하지 않는 것이 큰 혼란의 원인이다.

외부 키(외부 키 색인)를 만들면 이진 검색 트리가 생성됩니다(트리가 값을 검색하는 데 사용되므로 사전이라고도 함).BST(Binary Search Tree)는 컴퓨터 메모리에 존재하며 물리적 디스크 공간을 차지하지만 하위 테이블에서 상위 테이블까지 O(log n) JOIN 액세스 시간을 거의 즉시 허용합니다.

외부 키 제약 조건 작성은 외부 키 열에서 (INSERT, SELECT 등) 처리할 때 호출되는 코드 조각인 규칙을 작성하는 것입니다.제약은 기본적으로 데이터베이스 트리거입니다.제약 조건은 전자 메일 필터와 같습니다. 특정 액션(예: When (new e-메일) IF (From: crzy@xgfrnd.com) {SEND TO Trash Folder;})에서 호출되는 코드입니다.

따라서 외부 키 "Constraint"는 호출되는 코드 조각(트리거, 기본적으로는 "INSERT child_column IF(NOT IN parent_table)"는 삽입을 허용하지 마십시오.

다음으로 Cascades 및 Updates 및 Delete 규칙(제약)을 설정할 수 있습니다.다양한 if 조건과 조작 등이 있습니다.

따라서 "외부 키"는 하위 테이블 열 값을 상위 테이블 열 값에 매핑하는 BST 사전입니다.외부 키의 목적은 속도입니다(데이터 무결성은 인덱스를 사용하지 않고도 느리지만 데이터 무결성을 달성할 수 있으므로 데이터 무결성이 아님).

외부 키 제약은 규칙입니다.SQL 문에서 트리거되는 코드입니다.이 규칙은 테이블 통과를 피하기 위해 고속 처리를 위한 사전으로 BST를 사용합니다.이 경우 최종적으로 데카르트식 동작이 발생할 수 있습니다.외부 키 제약의 목적은 데이터 무결성입니다.

참조된 부모 열 자체가 부모 테이블의 키가 아닌 부모 테이블을 작성한 적이 없습니다.그러면 문제는 외부 키 색인(BST 딕셔너리)이 실제로 필요한가 하는 것입니다.데이터 무결성을 확보하기 위해 제약조건이 반드시 필요하지만 외부 키 규칙을 충족하기 위해 외부 키 색인(BST 사전)은 실제로 필요하지 않습니다. 따라서 "Key"와 "Index"에는 두 가지 정의가 있습니다."Index"는 BST 트리이고 "Key"는 규칙(자녀 값이 부모 테이블에 존재해야 한다는 생각)입니다.그러나 MySQL에서는 Foreign Key Index가 필요합니다.Foreign Key Index가 필요한 이유는 Foreign Key Index를 프로그래밍했기 때문입니다.BST 트리는 부모 열 자체가 인덱싱되지 않은 경우에 더 빠릅니다.참조하는 부모열을 키(인덱스)가 아닌 것으로 하는 것은 권장하지 않습니다.그러나 BST가 없는 외부 키 제약 조건을 사용하여 색인화되지 않은 부모 열을 참조한 경우 SQL 작업이 점차 느려지고 애플리케이션이 크롤 상태가 될 수 있습니다.

혼란: 형용사와 동사.

우리가 '외부키'라고 말할 때, 우리는 보통 '외부키 관계'를 말하는 것이지, '외부키 색인'을 말하는 것이 아니다.하지만 Key라는 단어는 Index를 의미합니다.그래서 그게 모든 혼란의 근원이군요.즉, 예약된 키워드 정의 표준이 없습니다.MySQL CREATE TABLE 문에서 FORNE KEY는 Index(BST)를 의미하며, RESTRAINT는 규칙을 명명하기 때문에 실제 SQL 문에서 정의되는 것과 달리 "Foreign Key"라는 문구가 다르기 때문에 혼동이 발생합니다.

컴퓨터 코드에서 "Foreign"은 형용사이고 "Key"는 인덱스를 의미하는 명사입니다.

구어체에서는, 「외부 키」는 형용사이며, 「색인」, 「제약」, 「관계」는 모두 명사입니다.사무실 칸막이를 통해 서로 대화할 때 "외부 키"는 데이터 무결성에 대한 "아이디어"를 의미합니다(즉, 인덱스가 아닌 규칙).

불행히도 프로그래머들은 항상 짧은 타이핑 방법을 찾고 있는데, 이것은 종종 혼란을 일으킨다.컴퓨터 과학의 모든 것은 트레이드오프이며 코딩 스타일을 포함합니다.

하기 위한 KEY MySQL이 예약된 단어가 KEY RESTRAING 입니다.fk1_rule_child_column 키 색인 Index)fk_bst_child_to_parent_columnparent_table )parent_column)

또한 MySQL은 항상 Index와 Constraint를 모두 작성하므로 MySQL 작성자는 외부 키 관계의 이중 요소를 완전히 숨겼을 수 있습니다.측면을 Key 수도 .my_foreign_key이중 디테일이 숨겨져 있습니다.

그럼에도 불구하고 MySQL은 저렴하고 견고하며 훌륭합니다.참고로 불평은 일절 없고, 크리에이터에게 감사할 뿐입니다.나로서는 그들이 원하는 대로 할 수 있다.

참고로 스타일 권장사항으로 항상 부모 열과 자식 열의 이름을 동일하게 지정해야 하며 테이블 이름에는 항상 외부 키 관계가 포함되어야 합니다.그럼 테이블은

customers products attributes orders

대신 이름을 붙여야 한다.

customers products product_attributes customer_product_orders

이렇게 해서 당신과 당신의 후계자들은 어떤 테이블 이름이라도 읽는 것만으로 외국의 주요 관계를 알 수 있습니다.타이핑하기 힘들면

cust prod prod_attr cust_prod_ord

그렇다고 해서 추측하고 있다.BST와 규칙에 대한 설명이 정확한지는 잘 모르겠지만, 맞는 설명이라고 생각합니다.이 혼란스러운 문제가 해결되기를 바랍니다.하지만 데이터베이스 거트 같은 여러분들이 제가 쓴 글을 확인, 수정, 보완 또는 부인해주시면 감사하겠습니다. 제가 틀렸다면, 진짜 답은 무엇일까요? 그래서 우리는 마침내 이 다세대 미스터리를 풀 수 있습니다.만약 제가 완전히 틀려서 이 답변을 삭제해야 한다면 그것도 괜찮습니다.

이것은 MySQL에서 가장 혼란스러운 토픽일 것입니다.

예를 들어 'PRIMAY KEY', 'FORAND KEY', 'UNIQU' 키는 실제로 인덱스라고 하는 사람도 많습니다(MySQL 공식 문서는 여기에 포함되어 있습니다).

반면, 다른 많은 사람들은 이러한 제약이 다소 있다고 말합니다(사용 시 영향을 받는 열에 제한을 가하는 것이 타당합니다).

만약 그것들이 정말로 인덱스라면, 이름을 붙이기 위해 제약조건인 클라우슐을 사용하는 것이 무슨 의미가 있을까요?왜냐하면 인덱스를 만들 때 그 이름을 사용할 수 있어야 하기 때문입니다.

예:

... FORENAL KEY index_name (col_name1, col_name2, ...)

FORENAL KEY가 인덱스일 경우 index_name을 사용하여 처리할 수 있습니다.하지만, 우리는 할 수 없다.

그러나 인덱스가 아니라 인덱스를 사용하여 작동하는 실제 제약 조건이라면 이 방법이 타당합니다.

어쨌든, 우리는 모릅니다.사실 아무도 모르는 것 같아요.

언급URL : https://stackoverflow.com/questions/310561/mysql-terminology-constraints-vs-foreign-keys-difference

반응형